【问题标题】:Ordering post with time and points (like reddit) firestore订购带有时间和点的帖子(如reddit)firestore
【发布时间】:2020-06-09 10:10:29
【问题描述】:

我如何为 firebase firestore 创建一个查询,它可以为我提供“最热门”的帖子。我希望这样的查询可以与 nodejs 一起使用:

SELECT Title, LOG10(Likes + 1) * 86400 / .301029995663981 + UNIX_TIMESTAMP(Submitted) AS Hotness
FROM article
ORDER BY Hotness DESC

使用 Firestore 执行此操作的最佳方法是什么?

此查询的信用:Reddit hotness score

【问题讨论】:

    标签: javascript node.js firebase google-cloud-firestore


    【解决方案1】:

    一种解决方案是在每个post 文档中添加一个字段,其中包含计算值。

    每次更新博后,您都会更新此字段through a Cloud Function(即从后端)。由于 Cloud Functions 代码是以管理员权限执行的,因此您可以编写一个安全规则来阻止用户直接更新此字段(参见 doc),并且仍然让 Cloud Functions 更新该字段。

    要进行计算,您需要喜欢的 nbr,您应该拥有的数量和创建日期。

    对于创建日期,在创建文档时按如下操作:

    ....collection('posts').add({foo: 'bar', ..., createdOn: firebase.firestore.FieldValue.serverTimestamp()});
    

    这样,您的查询是一个非常简单的 orderBy 查询,请参阅 Firestore doc

    【讨论】:

    • 所以我得经常更新这个分数,这样好像效率不高,我错了吗?
    • 每次点赞数发生变化时,您都需要更新文档。在 NoSQL 世界中,尤其是 Firestore,由于您无法基于聚合或计算构建复杂的查询,因此这是一种非常经典的方法。请注意,在定价方面,大约需要一次写入和一次 Cloud Function 调用。 CF 调用成本为 0.40 美元/百万,Firestore 写入成本为 0.18 美元/10 万美元。
    猜你喜欢
    • 2020-06-21
    • 2013-03-18
    • 2018-05-21
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多