从firestore获取文档列表

时间:2018-09-08 00:41:22

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

我有一个accounts集合,其结构如下:

enter image description here

现在我有一个拥有两个帐户的用户:

enter image description here

如何查询以获取此用户的帐户并将其作为承诺的解决方案返回?

这是我尝试过的。它返回[]

 getAccounts(user_id, userRef) {
        return new Promise((res, rej) => {
            this.db.runTransaction((transaction) => {
                return transaction.get(userRef.doc(user_id)).then((userDoc) => {
                    let accounts = []
                    if (!userDoc.exists) {
                        throw "User Document does not exist!";
                    }
                    let userData = userDoc.data()
                    let accountList = userData.accounts

                    for (var id in accountList){
                        transaction.get(this.ref.doc(id)).then(ans => {
                            accounts.push(ans.data())
                        }).catch(e => {
                            console.log(e)

                        })
                    }
                    return accounts
                }).then(function (ans) {
                    res(ans)
                }).catch((e) => {
                    console.log(e)
                });
            }).catch(function (err) {
                console.error(err);
                rej(err)
            });

        })
    }

1 个答案:

答案 0 :(得分:1)

您不需要使用交易,因为您只是阅读一些文档。由于您要并行执行两个(或多个)异步返回承诺的方法(即帐户文档的两个get()),因此应使用Promise.all()

以下几行应该可以起作用:

getAccounts(user_id, userRef) {
   return db.collection('users').doc(user_id).get()  //replaced since I am not sure what is this.db in your case
   .then(userDoc => {
       const promises = []
       if (!userDoc.exists) {
           throw "User Document does not exist!";
       }
       let userData = userDoc.data()
       let accountList = userData.accounts

       for (var id in accountList){
           promises.push(db.collection('accounts').doc(id).get())
       })
       return Promise.all(promises)
   })
   .then((results) => {
       return results.map(doc => doc.data());
    })
    .catch(err => {
        ....
    });
 }

请注意,由于我不确定100%是DocumentReference,所以db.collection('users').doc(user_id)(即db.collection('accounts').doc(id)this.ref使用了“经典”定义, this.db。随心所欲地适应!

您也可以根据需要使用return new Promise((res, rej) => {})对其进行重做,但是总体原理保持不变。