【问题标题】:Is there a way to query for a Firestore collection to get the number of times a field's value occurs?有没有办法查询 Firestore 集合以获取字段值出现的次数?
【发布时间】:2020-01-20 08:22:53
【问题描述】:

我想要做的是以这样的方式查询一个集合:
1.我可以得到true值在所有文档中出现的次数

例如,有没有办法检查每个文档并查询匹配 true 的文档字段?

  1. 之后,将true 值出现在变量中的次数存储起来。

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    有不同的可能方法:

    1。获取字段为TransmitterError == true的所有文档

    您可以编写一个返回所有文档的查询并使用QuerySnapshotsize 属性:

    db.collection("Londiani Hill").where("TransmitterError", "==", true)
        .get()
        .then(function(querySnapshot) {
            console.log(querySnapshot.size);
        })
        .catch(function(error) {
            console.log("Error getting documents: ", error);
        });
    

    这种方法的问题在于,您要阅读所有文档,其中包含TransmitterError = true 字段每次您想计算它们时,这是有代价的。 p>

    2。维护一个计数器

    您可以在每次创建具有字段TransmitterError = true 的文档时增加一个计数器(如果您删除文档或将TransmitterError 的值更改为false,则减少它)。您需要为每个集合维护一个计数器。

    要实现计数器,您可以为每个集合使用一个Distributed counter,或者在每个集合中使用一个“计数器”文档,其中您有一个计数器字段,您可以使用firebase.firestore.FieldValue.increment() 递增,请参阅doc

    两种类型的计数器之间的选择标准是特定集合的计数器将被更新的次数:事实上,在 Cloud Firestore 中,您只能更新单个文档大约一次每秒。因此,如果您知道计数器的文档可能每秒更新一次以上,则应选择分布式计数器方法,否则,您可以依赖每个集合一个计数器文档。

    【讨论】:

    • 这种方法看起来不错,但这是我所避免的。查询每个字段。有没有办法只查看所有文档而不指定字段?刚刚出现true
    • 不,您不能使用客户端 SDK 仅查询文档字段的子集。这可以通过 REST API 实现,但不能通过客户端 SDK。但这不是主要问题:您可以维护一个并行集合,其中包含具有相同 UID 且只有 TransmitterError 字段的文档。主要问题是您每次要计算所有带有 TransmitterError = true 字段的文档时都会读取它们,这是有代价的(firebase.google.com/pricing)。
    • 所以在您看来,这种方法的成本会很高。感谢您的建议
    【解决方案2】:

    这可能会帮助您解决问题

    db.collection("Londiani Hill").where("TransmitterError", "==", true).get().then(function(querySnapshot) {      
        console.log(querySnapshot.size); 
    });
    

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多