如何在 forEach 循环中运行猫鼬查询

新手上路,请多包涵

谁能帮助我如何在nodejs的forEach循环中运行猫鼬查询并建议两个集合的内部连接结果需要

像下面的细节

userSchema.find({}, function(err, users) {
    if (err) throw err;
    users.forEach(function(u,i){
        var users = [];
        jobSchema.find({u_sno:s.u.sno}, function(err, j) {
            if (err) throw err;
            if (!u) {
                res.end(JSON.stringify({
                    status: 'failed:Auction not found.',
                    error_code: '404'
                }));
                console.log("User not found.");
                return
            }
            users.push(j);
        })
    })
    res.send(JSON.stringify({status:"success",message:"successfully done",data:{jobs:j,users:u}}));
})

原文由 lakshmankashyap 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 311
2 个回答

你可以使用这个:

 db.collection.find(query).forEach(function(err, doc) {
   // ...
});

原文由 tdog 发布,翻译遵循 CC BY-SA 4.0 许可协议

Schema.find() 是一个异步函数。所以你的最后一行代码将在你等待第一个工作搜索在你的循环中执行时执行。我建议将其更改为 Promises 并使用 Promise.all(array)。

为此,首先您必须更改为将 Promise 与猫鼬一起使用。你可以像这样用蓝鸟做到这一点:

 var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

然后你可以使用 Promises 而不是像这样的回调:

 userSchema.find({}).then(function(users) {
  var jobQueries = [];

  users.forEach(function(u) {
    jobQueries.push(jobSchema.find({u_sno:s.u.sno}));
  });

  return Promise.all(jobQueries );
}).then(function(listOfJobs) {
    res.send(listOfJobs);
}).catch(function(error) {
    res.status(500).send('one of the queries failed', error);
});

编辑 如何列出工作和用户

如果你想要一个像这样的结构:

 [{
  user: { /* user object */,
  jobs: [ /* jobs */ ]
}]

您可以将列表合并在一起。 listOfJobs 与 jobQueries 列表的顺序相同,因此它们与用户的顺序相同。将用户保存到共享范围以访问“then 函数”中的列表,然后合并。

 ..
}).then(function(listOfJobs) {
  var results = [];

  for (var i = 0; i < listOfJobs.length; i++) {
    results.push({
      user: users[i],
      jobs: listOfJobs[i]
    });
  }

  res.send(results);
}).catch(function(error) {
  res.status(500).send('one of the queries failed', error);
});

原文由 R. Gulbrandsen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题