繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM