嵌套时Mongoose .count无法正常工作?

时间:2017-12-06 20:17:45

标签: node.js mongodb mongoose

也许我忽略了一些东西,但我的设置非常简单。我想要做的就是找到所有应用程序'我的数据库中的文档,然后每个应用程序获取与该应用程序关联的用户文档的数量。

AppObject.find({}).exec((err, apps) => {
  if (err) {

  } else if (!apps) {

  } else {
    apps.forEach((app, index) => {

      (function (app) {
        console.log('app ID ' + app._id);
        User.find({ appId: app._id }).count((countErr, count) => {
          console.log('COUNT ERR ' + JSON.stringify(countErr));
          console.log('Number of docs: ', count);
          // do more things with the App and the count
        });
      }(app));

    });
  }
});

当我查看控制台日志时,我看到的是行

console.log('app ID ' + app._id);

正确打印应用程序ID,但随后

console.log('Number of docs: ', count);

显示为0。

当我在forEach循环之外运行查询(并手动提供应用程序ID)时,它会正确返回文档数。

我有点不知所措,感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

你很容易错误地认为NodeJS中的行是按顺序执行的。

查看一些解释NodeJS事件循环的异步文章https://blog.risingstack.com/node-hero-async-programming-in-node-js/

您将发现在第一个for循环完成迭代后,对数据库的调用正在返回。

答案 1 :(得分:0)

我最近开始研究将Nodejs从回调地狱迁移到最新的Node版本8.x中提供的Async / Await的项目,请找到以下解决方案并试一试。谢谢。

//Create a async/await function with ES6 syntax 
const findAllCount = async () => {
try{
  const apps = await AppObject.find({})
  await apps.forEach( app, async () => {
  console.log('app ID ' + app._id)
  const count = await User.find({ appId: await app._id }).count()
  console.log('Number of docs: ', count)
  // Here you can continue to use app and count for more things
 })
}
 catch(error){console.error('Error at findAllCount function: '+error)}
}

// Invoke Function
findAllCount()

希望这会有所帮助。如果没有,请提供收集架构以重现我的方案。谢谢你,祝你一切顺利。