我目前正在开始使用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甚至有可能吗?如果是的话,我将如何做到这一点(最好不要循环并分别获取所有内容)?任何教程,文档或现有代码将不胜感激!
谢谢, 扬
答案 0 :(得分:1)
目前,Node.js中没有“不循环并分别获取所有内容”的方法。
您将必须:
get()
和forEach()
方法遍历您的客户端集合,如下所示:https://firebase.google.com/docs/firestore/query-data/get-data#get_all_documents_in_a_collection 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);
});