[英]How to list subcollections in a Cloud Firestore document
假设我将这个最小的数据库存储在 Cloud Firestore 中。 如何检索subCollection1
和subCollection2
的名称?
rootCollection {
aDocument: {
someField: { value: 1 },
anotherField: { value: 2 }
subCollection1: ...,
subCollection2: ...,
}
}
我希望能够从aDocument
中读取 id,但是当我get()
文档时只显示字段。
rootRef.doc('aDocument').get()
.then(doc =>
// only logs [ "someField", "anotherField" ], no collections
console.log( Object.keys(doc.data()) )
)
在 Node.js 中,您将使用“ListCollectionIds”方法
var firestore = require('firestore.v1beta1');
var client = firestore.v1beta1({
// optional auth parameters.
});
// Iterate over all elements.
var formattedParent = client.anyPathPath("[PROJECT]", "[DATABASE]", "[DOCUMENT]", "[ANY_PATH]");
client.listCollectionIds({parent: formattedParent}).then(function(responses) {
var resources = responses[0];
for (var i = 0; i < resources.length; ++i) {
// doThingsWith(resources[i])
}
})
.catch(function(err) {
console.error(err);
});
客户端 SDK(Web、iOS、Android)目前不支持此功能。
似乎他们在 Node.js 中添加了一个名为getCollections()
的方法:
firestore.doc(`/myCollection/myDocument`).getCollections().then(collections => {
for (let collection of collections) {
console.log(`Found collection with id: ${collection.id}`);
}
});
此示例打印出位于/myCollection/myDocument
的文档的所有子集合
文档中没有详细说明吗?
/** * Delete a collection, in batches of batchSize. Note that this does * not recursively delete subcollections of documents in the collection */ function deleteCollection(db, collectionRef, batchSize) { var query = collectionRef.orderBy('__name__').limit(batchSize); return new Promise(function(resolve, reject) { deleteQueryBatch(db, query, batchSize, resolve, reject); }); } function deleteQueryBatch(db, query, batchSize, resolve, reject) { query.get() .then((snapshot) => { // When there are no documents left, we are done if (snapshot.size == 0) { return 0; } // Delete documents in a batch var batch = db.batch(); snapshot.docs.forEach(function(doc) { batch.delete(doc.ref); }); return batch.commit().then(function() { return snapshot.size; }); }).then(function(numDeleted) { if (numDeleted <= batchSize) { resolve(); return; } // Recurse on the next process tick, to avoid // exploding the stack. process.nextTick(function() { deleteQueryBatch(db, query, batchSize, resolve, reject); }); }) .catch(reject); }
这个答案在文档中
遗憾的是,文档并不清楚您导入的内容。
根据文档,我的代码最终看起来像这样:
import admin, { firestore } from 'firebase-admin'
let collections: string[] = null
const adminRef: firestore.DocumentReference<any> = admin.firestore().doc(path)
const collectionRefs: firestore.CollectionReference[] = await adminRef.listCollections()
collections = collectionRefs.map((collectionRef: firestore.CollectionReference) => collectionRef.id)
这当然是 Node.js 服务器端代码。 根据文档,这不能在客户端上完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.