在 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) 错误:无法找到 $geoNear 查询的索引