如何在Firestore上的文档中获取集合?

时间:2020-03-22 16:11:51

标签: javascript firebase google-cloud-firestore

我有一个名为users的集合,每个文档的用户内部都有一个名为monthlies的集合,我想得到它。 这是结构:

enter image description here

现在,我尝试使用以下方法获取它:

var getUsers = async function() {
        var db = firebase.firestore()
        var users = await firebase
            .firestore()
            .collection("users")
            .get();
        return users
}

var getMonthlyByUserId = async function () {
    var users = await getUsers()
    users.forEach(element => {
        var monthlies = element.collection('monthlies').get()
        console.log(monthlies.docs.map(doc => doc.data()))
    })
}

但是它什么也不打印。目标是对所有文档每月一次的收集进行迭代。

2 个答案:

答案 0 :(得分:1)

除了道格指出的问题(您需要使用ref的{​​{1}}属性)之外,还需要考虑get()方法是异步的。

这样做

QueryDocumentSnapshot

不起作用。

如果您不能使用集合组查询(例如,假设您的users.forEach(snapshot => { var monthlies = snapshot.ref.collection('monthlies').get() console.log(monthlies.docs.map(doc => doc.data())) }) 函数仅返回所有用户的子集,例如给定国家/地区的所有用户),则可以使用Promise.all()如下:

getUsers()

,您可以使用此article中介绍的技术来了解如何在var getMonthlyByUserId = async function () { const users = await getUsers(); const promises = []; users.forEach(snapshot => { promises.push(snapshot.ref.collection('monthlies').get()); }); const monthlies = await Promise.all(promises); monthlies.forEach(snapshotArray => { console.log(snapshotArray.docs.map(doc => doc.data())); }); } 内使用异步/等待。

答案 1 :(得分:0)

在您的代码中,filebeat.prospectors: - input_type: log paths: - /var/log/**/* QueryDocumentSnapshot类型的对象。它没有名为element的方法,因此我希望您的代码会因日志错误而崩溃。

如果要引用由QueryDocumentSnapshot表示的文档下组织的子集合,则应基于其ref属性:

collection()

或者,如果您只想查询所有称为“每月”的子集合中的所有文档,则可以用一个collection group query来简化。