firebase 特定集合下的FireStore集合组[副本]

x7yiwoj4  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(161)
    • 此问题在此处已有答案**:

collectionGroup within a certain path(2个答案)
9天前关闭。
我已经阅读了collectionGroup文档,并阅读了关于从特定文档获取集合的答案。
我正在寻找类似的东西,但我列出了所有的子集合,由特定集合内的文档引用。
例如,我理想的查询是db.collection('metrics').collectionGroup('days'),其中metrics是包含文档的大集合,每个文档都有一个子集合days

0aydgbwb

0aydgbwb1#

我是the answer you linked的作者,我调查了阻止我将答案扩展到包括文档和集合的防护措施,不幸的是,截至firebase v9.17.1,它仍然存在。
只要该防护措施仍然有效,收集组查询就只能搜索整个数据库,或者仅限于特定文档下的路径。目前不可能进行收集。
这个问题的解决方法是将metrics集合嵌套在它自己的文档下。为了提高效率,您需要尽可能地缩短集合ID和文档ID。在下面的示例中,我使用“g”作为“group”的缩写,使用“1”表示“group 1”(也可以使用“m”表示度量)。注意:如果您打算拥有10个以上的此类组,请立即开始使用0102等,否则下面的查询将返回无效结果。

"/g": {
  "/1": {
    "/metrics": {
      "/docA": {
        "/days": { /* ... */ }
      },
      "/docB": {
        "/days": { /* ... */ }
      },
      "/docC": {
        "/days": { /* ... */ }
      }
    }
  }
}

这将允许您使用以下命令限制指向该组的路径:

// note: legacy syntax
firebase.firestore().collectionGroup('days')
  .orderBy(firebase.firestore.FieldPath.documentId())
  .startAt("g/1"),
  .endAt("g/1\uf8ff")
  .get()
  .then((querySnapshot) => {
    console.log("Found " + querySnapshot.size + " docs");
    querySnapshot.forEach((doc) => console.log("> " + doc.ref.path))
  })
  .catch((err) => {
    console.error("Failed to execute query", err);
  })
xuo3flqw

xuo3flqw2#

您提到了获取文档下的集合。这是一个子集合,查询如下所示
db.collection('metrics').document('x').collection('days')
从该参考中,您可以查询文档xdays子集合中的文档
db.collectionGroup('days')
这将查询所有日集合中的所有文档,而不管它们在哪个文档下。

相关问题