如何使用AngularFire查询Firebase时间戳字段?

时间:2020-01-31 15:04:44

标签: typescript firebase angularfire

我正在尝试检索日期字段(类型为timestamp)小于当前系统时间的所有文档。 我的打字稿文件中的AngularFirestore查询看起来像这样。

this.afs.collection<events>('events' , ref => ref.where('date' , '<' , Date.now())).snapshotChanges();

以上查询不包含任何文档。

我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

刚刚在我的应用上进行了测试,我想您的数据库中有日期(or actually a Timestamp),因此您应该将该字段与日期对象进行比较:

this.afs.collection<events>('events' , ref => ref.where('date' , '<' , new Date())).snapshotChanges();

顺便说一句,如果用户的设备时钟在其设备之间不同步,或者如果用户在不同的时间范围内共享该值,则这可能会导致奇怪的行为。因此,最佳做法是在将值放入字段时使用serverTimestamp:

firebase.firestore.FieldValue.serverTimestamp()

在查询数据时,firebase.firestore.FieldValue.serverTimestamp()方法不可用,因此您可以使用以下选项:

  • 信任用户的时钟并使用提到的new Date()firebase.firestore.Timestamp.now()。在这种情况下,您可以考虑防止用户作弊的安全规则。
  • 必要时使用可调用的云函数进行精确的比较。

总体而言,我认为new Date()方法是最简单的方法,并且在大多数情况下都可以使用。