首页 > 解决方案 > 从 Firestore 获取文档列表

问题描述

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

在此处输入图像描述

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

在此处输入图像描述

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

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

 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)
            });

        })
    }

标签: node.jsfirebasenosqlgoogle-cloud-firestore

解决方案


您不需要使用事务,因为您只是在阅读一些文档。由于您想并行执行两个(或更多)返回承诺的异步方法(即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 => {
        ....
    });
 }

请注意,我对DocumentReferences (即db.collection('users').doc(user_id)db.collection('accounts').doc(id))使用了“经典”定义,因为我不能 100% 确定你this.refthis.db情况是什么。随心所欲地适应!

您也可以根据需要对其进行返工,return new Promise((res, rej) => {})但总体理念保持不变。


推荐阅读