node.js - 从 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)
});
})
}
解决方案
您不需要使用事务,因为您只是在阅读一些文档。由于您想并行执行两个(或更多)返回承诺的异步方法(即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 => {
....
});
}
请注意,我对DocumentReference
s (即db.collection('users').doc(user_id)
和db.collection('accounts').doc(id)
)使用了“经典”定义,因为我不能 100% 确定你this.ref
的this.db
情况是什么。随心所欲地适应!
您也可以根据需要对其进行返工,return new Promise((res, rej) => {})
但总体理念保持不变。
推荐阅读
- c# - 在地图上画一条线以显示路线
- google-chrome - YouTube 嵌入式播放器是否支持在跨源隔离站点中加载?
- google-sheets - 从所有参考日期的列表间隔中查找日期间隔的开始
- r - 如何将 gsub 和 imap 与列表一起使用
- mongoose - 将 NestJS GraphQL 插件与 Mongoose 一起使用
- powershell - 通过 CMD 运行带有参数的 Powershell
- powershell - 当我在 Visual Studio Code 中运行 ps1 脚本(powershell)来执行 SSIS 包时,它会在启动时自行暂停,我该如何停止这种行为?
- c# - 来自 Autofixture 声明性自动数据参数的属性的集合大小
- angular - Angular 将 API 结果从一个组件发送到不同路由中的另一个组件
- amazon-web-services - 有关 AWS EIP 分配日期和 Boto3 的元数据