当前位置:  开发笔记 > 编程语言 > 正文

如何在forEach循环中运行mongoose查询

如何解决《如何在forEach循环中运行mongoose查询》经验,为你挑选了1个好方法。



1> R. Gulbrands..:

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

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有