【问题标题】:How to fetch all subcollections documents from array of document-ids in firestore如何从firestore中的文档ID数组中获取所有子集合文档
【发布时间】:2021-02-16 12:50:47
【问题描述】:

我正在构建 javascript 服务,我想从 "collection name""document-id arrays" 的输入中获取来自 firestore 的所有子集合文档详细信息。

请求有效负载调用我的服务:

{
root_collection_name: "root_collection",
"msgId": ['11','22','33','66'],
"subcollection_name": "message"
}

我需要为所有这些 msgId 的搜索所有 子集合(所有文档的通用名称)文档。

我的 Firestore 结构如下所示

collection:
    document1:
        subcollection:
            document:
                "val1":"red",
                "val2":"blue",
                "val3":"green"
    document2:
        subcollection:
            document:
                "val1":"apple",
                "val2":"mango",
                "val3":"grape"
    document3:
        ..............
            ................

示例:

root_collection:
    11:
        aaa:
            message:
                "val1":"red",
                "val2":"blue",
                "val3":"green"
    22:
        bbb:
            message:
                "val1":"apple",
                "val2":"mango",
                "val3":"grape"
                

在这种情况下,我需要获取 msgId "11""22" 的数据,这些数据在 firestore 中可用,其他值应该发送空值。你能不能帮我解决这个问题,我不确定我在这里错过了什么。

这是我为此编写的代码。

const input = {
"root_collection_name": "root_collection",
"msgId": ['11','22','33','66'],
"subcollection_name": "message"
}
    

const test =  (input) => {
    const query = firestore.collection(input.root_collection_name).where('id', 'array-contains-any', input.msgId);
      query.get().then((querySnapshot) => {
        querySnapshot.forEach((document) => {
          document.ref.collection(input.subcollection_name).get().then((querySnapshot) => {
            querySnapshot.forEach(doc => {
              console.log('doc data',doc.data());
            });
          });
        });
      }); 
    };

test(input);

【问题讨论】:

  • 据我了解,您希望使用您提供的有效负载显示文档及其字段“val”。如果是这样,您能否更新并包括您如何在代码中调用这些有效负载输入?这将帮助社区复制您的程序,而无需花费太多时间让您的代码在他们的环境中运行。
  • @DonnaldCucharo 你说得对,我需要使用上面代码中添加的输入有效负载来获取“val”字段。如果您需要更多详细信息,请告诉我。

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


【解决方案1】:

如果您将顶级文档的 ID 添加到子集合文档中,则可以use collectionGroup

因此,从您的示例中,您将拥有:

root_collection:
11:
    aaa:
        message:
            "root_id": "11", // <<-- new!
            "val1":"red",
            "val2":"blue",
            "val3":"green"
22:
    bbb:
        message:
            "root_id": "22", // <<-- new!
            "val1":"apple",
            "val2":"mango",
            "val3":"grape"

您可以通过以下方式查询:

var msgs = firebase.firestore().collectionGroup('message')
             .where('root_id', 'in', ['11','22']);

注意:这将查询任何和所有名为 message 的子集合。当您向模型添加较新的子集合时,如果它们不是同一类型的“消息”,您可能会选择不同的名称。

【讨论】:

  • 感谢@Greg 的回复。我在子集合文档中确实有顶级文档 ID,但它存在于下面提到的属性数组下。
  • root_collection: 11: aaa: message: "root_elm":[ "root_name":"name1", "root_id": "11" ], "val1":"红色”,“val2”:“蓝色”,“val3”:“绿色”22:bbb:消息:**“root_elm”:[“root_name”:“name2”,“root_id”:“22”],** "val1":"apple", "val2":"mango", "val3":"grape" 您能否建议如何在 Firestore 查询中处理这种情况?
  • 我不理解“root_elm”节点。 [ "xx":"yy", "zz": "ww"] 不是有效的 JSON。请澄清。
  • 对不起。它的对象数组。我在下面更正和更新了结构。 root_collection:11:aaa:消息:“root_elm”:[{“root_name”:“name1”,“root_id”:“11”}],“val1”:“red”,“val2” :"blue", "val3":"green" 22: bbb: message: "root_elm":[{ "root_name":"name2", "root_id": "22"} ], " val1":"apple", "val2":"mango", "val3":"grape" 另外请告诉我我们是否需要为搜索元素启用索引?
  • firebase.firestore().collectionGroup('message').where('root_elm.root_id', 'in', ['11', '22']);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2020-08-08
  • 2023-03-08
相关资源
最近更新 更多