
[英]Express post request body returns undefined and stores null values to MongoDB
[英]MongoDB values with undefined script
我正在尝试从不同的数据库进行一些查询,但我无法将它们合并到一个forAll
中,以下查询可能由于我无法解决的async
调用而失败。
var someImageIds = ["111111111111111111"]
use "databaseA"
var transactions = db.transactions.find({"data.transactionImaginaryId": {$in: someImageIds}}) // uses index
use "databaseB"
transactions.forEach(transaction => {
var report = db.reports.find({"metadata.companyId" : parseInt(transaction.data.companyId) , "metadata.originReportId": transaction.data.reportId}).project({}) // uses index
var expenses = db.expenses.find({"metadata.reportId": report._id}) // uses index
var assets = db.assets.find({"_id": report.assets[0].imaginaryId}) // uses index
print(`report with status: ${"report.reportFlow.value"}, ${expenses.count()} expenses, ${assets.count()} assets for ${transaction.data.matchType} transaction _id: ${transaction._id.valueOf()}`)
})
问题是
var report = db.reports.find({"metadata.companyId" : parseInt(transaction.data.companyId) , "metadata.originReportId": transaction.data.reportId}).project({})
返回undefined
的值,我无法继续查询,因为下一行正在使用此行数据。
关于如何解决这个问题的任何想法? 我正在使用 NoSqlBooster v6.2.8、mongo4,并在 NoSqlBooster 控制台中编写。
谢谢!
感谢@Jeremy Thille,我设法编写了以下工作代码:
var someImageIds = ["111111111111111111"]
use "databaseA"
var transactions = db.transactions.find({"data.transactionImaginaryId": {$in: someImageIds}}) // uses index
use "databaseB"
transactions.forEach((transaction)=> {
const report = await(db.reports.find({ "metadata.companyId": parseInt(transaction.data.companyId), "metadata.originReportId": transaction.data.reportId }).toArray()) // uses index
const expenses = await(db.expenses.find({ "metadata.reportId": report[0]._id }).toArray()) // uses index
const assets = await(db.assets.find({ "_id": report[0].assets[0].imaginaryId }).toArray()) // uses index
print(`report with status: ${report[0].reportFlow.value}, ${expenses.length} expenses, ${assets.length} assets for ${transaction.data.matchType} transaction _id: ${transaction._id.valueOf()}`)
});
不幸的是,数据库(和 HTTP 请求,以及许多其他东西)不是即时的。 他们需要一些时间来执行一项操作。 所以你需要await
它们,这不能在.forEach()
循环中完成,但可以在for
循环中:
const someFunctionName = async () => { // needs async
for (let transaction of transactions) {
const report = await db.reports.find({ "metadata.companyId": parseInt(transaction.data.companyId), "metadata.originReportId": transaction.data.reportId }).project({}) // uses index
const expenses = await db.expenses.find({ "metadata.reportId": report._id }) // uses index
const assets = await db.assets.find({ "_id": report.assets[0].imaginaryId }) // uses index
print(`report with status: ${"report.reportFlow.value"}, ${expenses.count()} expenses, ${assets.count()} assets for ${transaction.data.matchType} transaction _id: ${transaction._id.valueOf()}`)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.