如何在 Cloud Firestore 文档中列出子集合

IT技术 javascript firebase google-cloud-firestore
2021-02-09 01:14:47

假设我在 Cloud Firestore 中存储了这个最小的数据库。我怎么能检索的名字subCollection1subCollection2

rootCollection {
    aDocument: {
        someField: { value: 1 },
        anotherField: { value: 2 }
        subCollection1: ...,
        subCollection2: ...,
    }
}

我希望能够从 中读取 id aDocument,但在我查看get()文档时只显示字段

rootRef.doc('aDocument').get()
  .then(doc =>

    // only logs [ "someField", "anotherField" ], no collections
    console.log( Object.keys(doc.data()) )
  )
3个回答

在 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)当前不支持此功能。

这不是什么好消息,但至少它来了。感谢更新。关于当前可用的递归删除带有子集合的文档的技术有什么建议吗?
2021-03-14 01:14:47
@DimuDesigns -> 不。
2021-03-20 01:14:47
@Dan McGrath 触发云功能有何帮助?ListCollectionIdsCloud Functions现在可用吗?
2021-03-23 01:14:47
@skylize -> 触发一个云函数来执行它。
2021-04-08 01:14:47
@Dan McGrath firestore 只是重新命名了云数据存储吗?
2021-04-10 01:14:47

似乎他们添加了一个调用getCollections()Node.js的方法

firestore.doc(`/myCollection/myDocument`).getCollections().then(collections => {
  for (let collection of collections) {
    console.log(`Found collection with id: ${collection.id}`);
  }
});

此示例打印出文档的所有子集合 /myCollection/myDocument

这看起来很有希望。由于这个问题,我不得不放弃使用 Firestore,并且没有机会再试一次。我希望我的问题能给其他人带来更好的体验。如果这已解决,正如您所建议的那样,那么我希望我有机会再试一次。
2021-03-12 01:14:47

这在文档中不是很详细吗?

/**
 * 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);
}
你想清楚了吗?
2021-03-13 01:14:47
在您在这里发布的所有代码中,与我的问题相关的唯一部分是顶部的评论,“这不会递归删除集合中文档的子集合”。我的特定预期用例是手动递归子集合,以便我可以使用文档中的说明删除它们。然而,出于某种疯狂的原因,我无法获得子集合的列表以了解要删除的内容。
2021-03-14 01:14:47
doc.data().someField.subCollection1doc.data().someField.subCollection1.val()doc.data().someField.subCollection1.val?
2021-03-18 01:14:47