【问题标题】:How to query for Firebase timestamp field using AngularFire?如何使用 AngularFire 查询 Firebase 时间戳字段?
【发布时间】:2020-05-17 06:33:00
【问题描述】:

我正在尝试检索日期字段(类型时间戳)小于当前系统时间的所有文档。 我的打字稿文件中的 AngularFirestore 查询如下所示。

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

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

我们将不胜感激。

【问题讨论】:

    标签: typescript firebase angularfire


    【解决方案1】:

    刚刚在我的应用程序上进行了测试,我猜你的数据库中有日期 (or actually a Timestamp),所以你应该将该字段与日期对象进行比较:

    this.afs.collection&lt;events&gt;('events' , ref =&gt; ref.where('date' , '&lt;' , new Date())).snapshotChanges();

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

    firebase.firestore.FieldValue.serverTimestamp()

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

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

    总的来说,我认为new Date() 方法是最简单的,并且在大多数情况下都有效。

    【讨论】:

    • 如何使用 serverTimestamp() 检索数据,因为我收到此错误Function Query.where() called with invalid data. FieldValue.serverTimestamp() can only be used with update() and set()
    • 好的,看来我错了,我更新了答案以更好地解释这一点我还添加了一个新的可能性:firebase.firestore.Timestamp.now()
    • 您能否解释一下如何使用可调用的云函数来实现这一点?我不想依赖用户设备时钟,因为用户可能会伪造/作弊。
    • 可调用函数基本上用一层身份验证取代了对服务器 API 的需求。以下文档将帮助您进行设置:firebase.google.com/docs/functions/callable 在可调用函数内部,您可以使用基本相同的请求,不同之处在于 new Date() 将是服务器的日期。请注意,Firebase 功能是一项付费服务​​,因此请在开始此方向之前检查一下 (firebase.google.com/pricing)。
    • 是的,我在我的安全规则中维护了该规则。
    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多