在NodeJS上的Firestore中收集所有数据

时间:2018-12-12 10:36:22

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

我目前正在开始使用Firestore,并且遇到了一些我找不到答案的问题。

我有以下收藏/文档设置:

* client (collection)
  - client1 (document)
    [...]
  - client2 (document)
      name: placholder
      projectId: 1234
      url: string
      * apiKeys (collection)
        - platform1 (document)
          name: name
          key: key
        - platform2 (document)
          name: name
          key: key

我想做的是获取完整的集合及其所有文档和子集合。最后,我的目标是将其保存在这样的对象中:

"client": {
    "client1": {...},
    "clinet2": {
        "name": "name",
        "projectId": 1234,
        "url": "http://localhost:5001",
        "apiKeys": {
            "platform1": {
                "name": "name",
                "apiKey": "key"
            },
            "platform2": {
                "name": "name",
                "apiKey": "key"
            }
        }
    }
}

使用Firestore甚至有可能吗?如果是的话,我将如何做到这一点(最好不要循环并分别获取所有内容)?任何教程,文档或现有代码将不胜感激!

谢谢, 扬

2 个答案:

答案 0 :(得分:1)

目前,Node.js中没有“不循环并分别获取所有内容”的方法。

您将必须:

  1. 使用get()forEach()方法遍历您的客户端集合,如下所示:https://firebase.google.com/docs/firestore/query-data/get-data#get_all_documents_in_a_collection
  2. 对于每个客户文档,以相同的方式遍历其apiKeys集合。

您可能应该使用Promise.all()来并行执行不同的异步get()操作。


与使用标准JavaScript库相比,使用Node.js可能具有的一个小优点是可以使用getCollections()方法列出文档引用的子集合(Web上不可用) / JavaScript)。但是,由于您的apiKeys集合似乎有一个已知的名称,因此不会带来任何实际差异。

答案 1 :(得分:0)

感谢Renaud Tarnec的回答。我写了一些代码来获取数据。它只是循环遍历所有集合,获取其中的所有文档,遍历那些集合中的所有文档,并获取第二个集合中的所有文档。它将其保存到全局变量。

代码可能会更好,但现在还可以!

如果您有任何疑问,请告诉我。

clients = db.collection('client')

global.config.client = {}

// We're gonna get all clients and their config files.   
// Very shitty way to do this, but cloudFirestore does not allow us to fetch a whole collection as an object.
// Looping the main client collection, getting all documents, looping over all collections in those also getting all documents.
// Asked on StackOverflow, see: https://stackoverflow.com/questions/53741109/getting-all-data-in-collection-in-firestore-on-nodejs/53741417#53741417
clients.get()
//Get all documents in Client
.then(documents => {
    documents.forEach(doc => {
        // Loop over all documents found in Client
        global.config.client[doc.id] = doc.data()

        clients.doc(doc.id).getCollections()
            //List all collections in the document
            .then(collection => {
                // Loop over all found collections
                collection.forEach(col => {
                    // Get all documents in found collection
                    console.log(doc.id, col.id)
                    clients.doc(doc.id).collection(col.id).get()
                        .then(documentsDeep =>
                            documentsDeep.forEach(docD => {
                                global.config.client[doc.id][col.id] = {
                                    [docD.id]: docD.data()
                                }
                                console.log(docD.id)
                            }))
                        .catch(err => {
                            console.log(logMarkup, 'Error getting documents (global.config.client.settings)', err);
                        });
                })
            })
            .catch(err => {
                console.log(logMarkup, 'Error getting documents (global.config.client.settings)', err);
            });
    })
})
.catch(err => {
    console.log(logMarkup, 'Error getting documents (global.config.client.settings)', err);
});