由于我在Cloud Firestore中将dueDate
字段存储为“时间戳”(而不是字符串或数字),因此我这样做来获取截止日期为2017年的发票文档:
let start = new Date('2017-01-01');
let end = new Date('2018-01-01');
this.afs.collection('invoices', ref => ref
.where('dueDate', '>', start)
.where('dueDate', '<', end)
);
注意:dueDate
字段以一个Date()对象的形式存储在Firebase中,例如:this.doc.dueDate = new Date('2017-12-25')
.where('team_id', '==', teamId).where('time', '>=', start).where('time', '<=', end)
- widavies var startfulldate = admin.firestore.Timestamp.fromDate(new Date(1556062581000));
db.collection('mycollection')
.where('start_time', '<=', startfulldate)
.get()
.then(snapshot => {
var jsonvalue: any[] = [];
snapshot.forEach(docs => {
jsonvalue.push(docs.data())
})
res.send(jsonvalue);
return;
}).catch( error => {
res.status(500).send(error)
});
const event = new Date();
const expirationDate = admin.firestore.Timestamp.fromDate(event);
const query = collectionRef.where('startTime', '<=', expirationDate)
由于startTime
存储为Timestamp
,因此您可以执行此查询范围以获得更准确的结果(适用于长日期范围或相同日期范围的两种情况)。
const start = new Date('2021-01-01T00:00:00.000z');
const end = new Date('2021-03-01T23:59:59.000z');
db.collection('Data').where('startTime', '>=', start).where('startTime', '<=', end).get().then(data => {
//pass your 'data' here
});
我在我的 Node.js 应用中使用了这个。希望它对你有用。
最近使用 Firebase Firestore 的所有用户需要注意,根据你的 Firebase 实现设置(根据 firebase 版本)会有一些差异。
之前,Firestore 把 Timestamp
保存为 Date
,然而正如文档中所述,这种方式很快就会被 Timestamp
对象取代。请参见此处的 Timestamp 文档。
你可以通过在代码中添加以下设置强制 Firebase 使用 Timestamp 对象而不是 Date来实现:
var firebaseApp = firebase.initializeApp({
apiKey: [APIKEY],
authDomain: [FIREBASEAPPDOMAIN],
projectId: [PROJECTID]
});
var firestore = firebase.firestore();
var settings = { timestampsInSnapshots: true }; // force Timestamp instead of Date
firestore.settings(settings);
解决方案是使用Date.now()。停止使用Firebase的时间戳服务,您需要使用毫秒级别的数字时间值,例如:1514271367000,而不是类似于Firestore使用26/12/2017 1:56:07 GMT-0500(-05)将无法工作的日期格式。查询示例:
this.fsService.afs.collection('chats/4bY1ZpOr1TPq8bFQ3bjS/finance/123+finance/12345'
, ref => ref.orderBy('hour').startAt(1514184967000).endAt(1514271367000))
.valueChanges().subscribe(data =>{
this.mensajes = data;
})
像我一样使用PHP访问Firestore的人,可以尝试以下方法:
$startTime = new DateTime('2020-05-23 00:00:00');
$endTime = new DateTime('2020-06-23 23:59:59');
$start = new Google\Cloud\Core\Timestamp($startTime);
$end = new Google\Cloud\Core\Timestamp($endTime);
// fb is a Google\Cloud\Firestore\FirestoreClient object
$this->query = $this->fb->collection('your_collection');
$aux = $this->query;
$aux = $aux->where('startTime', '<', $end);
$aux = $aux->where('startTime', '>', $start);
return $aux->documents();
尽情享受。
通用函数,可按特定字段的日期范围查找集合中的文档:
public List<QueryDocumentSnapshot> findDocsByDateRange(
String collection,
String fieldStartDate,
String fieldEndDate,
Date startDate,
Date endDate) {
ApiFuture<QuerySnapshot> querySnapshot = fireStore()
.collection(collection)
.whereGreaterThanOrEqualTo(FieldPath.of(fieldStartDate), startDate)
.whereLessThanOrEqualTo(FieldPath.of(fieldEndDate), endDate)
.get();
return querySnapshot.get().getDocuments();
}
软件包:
import com.google.api.core.ApiFuture;
import com.google.cloud.firestore.DocumentSnapshot;
import com.google.cloud.firestore.FieldPath;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;