Javascript Mongoose Express.js从多个查询中获取结果

Javascript Mongoose Express.js从多个查询中获取结果,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图使用异步方法从mongodb上的一系列查询中获得结果,但不幸的是,我生成的对象在异步函数范围之外没有定义 let dataObject = { prop1: 1, prop2: 2 .... }; let result = {}; _.each(dataObject, async function (val, key) { let query = [

我试图使用异步方法从mongodb上的一系列查询中获得结果,但不幸的是,我生成的对象在异步函数范围之外没有定义

      let dataObject = {
         prop1: 1,
         prop2: 2
         ....
      };

      let result = {};

      _.each(dataObject, async function (val, key) {

        let query = [
          {
            $match: {
              x:1
              ....
            }
          }
        ];

        let = MyModel.aggregate(query);
        let data = await q.exec();

          if (data.length > 0) {
            result[key] = data[0].myProp;
            console.log(result); // I can see result here
          }
       });

       console.log('====>>', result); // Here the result is undefined

我缺少什么?

对于这个问题,您可以创建一个promise函数,例如
getData
,dataObject作为输入参数,函数返回结果如下:

let async = require('async');
let q = require('q');

const getData = async (dataObject)=>{
  let defer =q.defer();
  let result = []
  input = Object.keys(dataObject)
  async.eachSeries(input , async(key)=>{
    try {
      let query = [
        {
          $match: {
            x:1
            ....
          }
        }
      ];
      let data = await MyModel.aggregate(query).lean();
      if (data.length > 0) {
        result[key] = data[0].myProp;
        console.log(result);
      }
    } catch (error) {
      console.log(error)
    }
  },()=>{
    console.log("finish process")
    defer.resolve(result)// return final data
  })
  return defer.promise
}
const mainFunctio = async()=>{
  dataObject
  console.log(start)
  result  = await getData(dataObject)
  console.log(result)
}
在main函数中调用此函数(
getData
),如下所示:

let async = require('async');
let q = require('q');

const getData = async (dataObject)=>{
  let defer =q.defer();
  let result = []
  input = Object.keys(dataObject)
  async.eachSeries(input , async(key)=>{
    try {
      let query = [
        {
          $match: {
            x:1
            ....
          }
        }
      ];
      let data = await MyModel.aggregate(query).lean();
      if (data.length > 0) {
        result[key] = data[0].myProp;
        console.log(result);
      }
    } catch (error) {
      console.log(error)
    }
  },()=>{
    console.log("finish process")
    defer.resolve(result)// return final data
  })
  return defer.promise
}
const mainFunctio = async()=>{
  dataObject
  console.log(start)
  result  = await getData(dataObject)
  console.log(result)
}

作为一个参考,我张贴了一个解决方案,我发现,看起来非常简单。 我尝试使用一个简单的for循环,并删除了exec()(正如Mohammad所建议的那样),而不是使用u2;.each运算符,结果正如预期的那样:

  let dataObject = {
     prop1: 1,
     prop2: 2
     ....
  };

  let result = {};
  let allKeys = Object.keys(dataObject)
   for (key of allKeys) { {

    let query = [
      {
        $match: {
          x:1
          ....
        }
      }
    ];

    let data = MyModel.aggregate(query);

      if (data.length > 0) {
        result[key] = data[0].myProp;
      }
   });

   console.log('====>>', result); // works fine!

我已经检查了多次代码:/maybe是因为async/await作用域?我尝试了您的解决方案,但使用此方法我得到了属性的值(例如,在prop1中,我在属性名称上得到了1),我需要两个键值来创建最终的对象。谢谢。我已经更新了我的答案,检查它,输入=对象。键(数据对象)我已经相应地更新了代码,但是结果对象仍然没有定义。我还尝试在循环中手动填充属性,结果总是在开始时定义的空数组。我很困惑。。。ThanksI编辑了我的答案,运行它,并向我显示输出结果。我也尝试过:结果:{}输出:[]完成谢谢