如何使用 AngularFire 查询 Firebase 时间戳字段?
How to query for Firebase timestamp field using AngularFire?
我正在尝试检索日期字段(时间戳类型)小于当前系统时间的所有文档。
我的打字稿文件中的 AngularFirestore 查询如下所示。
this.afs.collection<events>('events' , ref => ref.where('date' , '<' , Date.now())).snapshotChanges();
以上查询不包含任何文档。
不胜感激。
刚刚在我的应用程序上测试过,我猜你的数据库中有日期 (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()
方法是最简单的,并且适用于大多数情况。
我正在尝试检索日期字段(时间戳类型)小于当前系统时间的所有文档。 我的打字稿文件中的 AngularFirestore 查询如下所示。
this.afs.collection<events>('events' , ref => ref.where('date' , '<' , Date.now())).snapshotChanges();
以上查询不包含任何文档。
不胜感激。
刚刚在我的应用程序上测试过,我猜你的数据库中有日期 (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()
方法是最简单的,并且适用于大多数情况。