我需要帮助来查询带有日期范围的长收藏集。请参阅以下示例文档。我想使用日期范围查询startTime字段。
Answers:
由于我在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)
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)
});
对于最近使用Firebase Firestore的每个人,根据您对Firebase实施的设置(取决于Firebase版本)会有差异。
之前,Firestore另存Timestamp
为Date
,但是如文档此处所述,该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);
像我这样使用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();
请享用。
解决方案是使用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;
})
用于按特定字段的日期范围在集合中查找文档的通用函数:
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;