【问题标题】:MongoDB values with undefined script带有未定义脚本的 MongoDB 值
【发布时间】:2021-02-01 15:39:33
【问题描述】:

我正在尝试从不同的数据库中进行一些查询,但我无法将它们合并到一个 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 Tille,我设法编写了以下 WORKING 代码:

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

【问题讨论】:

    标签: javascript mongodb nosql


    【解决方案1】:

    不幸的是,数据库(以及 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()}`)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 2016-05-08
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      相关资源
      最近更新 更多