如何从Firestore中的文档ID数组中获取所有子集合文档

时间:2020-11-03 19:53:09

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

我正在构建javascript服务,我想从其中输入“集合名称” “ document-id数组” 。从firestore中获取所有子集合文档详细信息。 / p>

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

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

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

我的消防站结构如下

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"
                

在这种情况下,我需要获取在Firestore中可用的 msgId “ 11” “ 22” 的数据,并且其他值应该发送空值。您能帮上忙吗,不确定我在这里想念的地方。

这是我为此编写的代码。

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);

1 个答案:

答案 0 :(得分:0)

如果将顶级文档的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的所有子集合。当您向模型中添加较新的子集合时,如果它们不是同一类型的“消息”,则可以选择其他名称。