在Mongoose中一次执行多个查询

时间:2017-12-11 03:50:52

标签: javascript arrays mongodb object mongoose

我试图将Mongoose中的两个查询合并为一个。

现在,我这样做:

User.find({ _id: req.body.userId }, (err, user) => {
  User.find({ username: decodedUser.username }, (err, member) => {
   console.log("user\n", user)
   console.log("member\n", member)
 })
})

我想对数据库进行一次User.find()查询,结果是我想要的所有文档的对象(或数组),例如[user, member]的数组在这种情况下。这样我就不必再运行User.find()两次了。理想情况下,我希望查询的结果是一个对象,这样我就可以更容易地找到一个特定的键/值集,而不是我必须迭代查找特定元素的数组。 我该怎么做?

注意:这有效:

User.find({ $or:
  [
    { _id: req.body.userId },
    { username: decodedUser.username}
  ]}, (err, results) => {
  console.log("results\n", results)
})

其中results是我想要的文档数组。但是,我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:5)

如果您希望两个条件只能得到一个结果,那么您可以使用User.findOne - 它将返回第一个找到的结果。

User.findOne({ $or:
  [
    { _id: req.body.userId },
    { username: decodedUser.username}
  ]}, (err, user) => {
  console.log("user\n", user)
})

修改

由于您说您需要获得2个结果,并且您希望在结果中获得结果,您还可以并行运行2个查询并使用promises来获得结果。 E.g。

Promise.all([
  User.find({ _id: req.body.userId }),
  User.find({ username: decodedUser.username})
]).then( ([ user, member ]) => {
  console.log( util.format( "user=%O member=%O", user, member ) );
});