在 Mongoose 中一次执行多个查询

Posted

技术标签:

【中文标题】在 Mongoose 中一次执行多个查询【英文标题】:Execute multiple queries at once in Mongoose 【发布时间】:2018-05-24 13:52:57 【问题描述】:

我正在尝试将 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】:

如果您期望两种条件都只有一个结果,那么您可以使用User.findOne - 它会返回第一个找到的结果。

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

编辑

既然您说您需要获得 2 个结果,并且您希望在结果中获得结果,您还可以并行运行 2 个查询并使用 Promise 来获得结果。例如

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

【讨论】:

感谢您的回复。我实际上期待两个结果。最终目标是在一次执行中运行两个 User.find() 查询,而不是像上面的示例中那样执行两次 User.find(),如果这有意义的话。 那么你的解决方案对我来说是最好的 是的!您的“编辑”正是我一直在尝试做的。哦,伙计,谢谢! 出于好奇,您的最后一行console.log( util.format( "user=%O member=%O", user, member ) ); 是做什么的?刚尝试在本地运行它,我的终端没有输出任何内容。具体来说,我对util.format不是很熟悉。 你需要有const util = require('util');这是一个标准的NodeJS实用服务。在此处查看文档:nodejs.org/api/util.html

以上是关于在 Mongoose 中一次执行多个查询的主要内容,如果未能解决你的问题,请参考以下文章

(Mongo/Mongoose) 如何处理等待多个查询的结果

Mongo基础使用,以及在Express项目中使用Mongoose

如何承诺 Mongo/Mongoose 找到

Mongo (+Mongoose) 错误:无法找到 $geoNear 查询的索引

在 Django 中一次提交中执行多个 save() 的最佳方法

使用Mongoose(ORM)将多个应用程序与一个mongo数据库连接