在猫鼬中一次执行多个查询

Far*_*rid 2 javascript arrays object mongoose mongodb

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

现在,我正在这样做:

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)
 })
})
Run Code Online (Sandbox Code Playgroud)

我想User.find()对数据库进行单个查询,结果是我想要的所有文档的对象(或数组),例如[user, member]本例中的数组。这将使我不必再运行User.find()两次。理想情况下,我希望查询的结果是一个对象,这样我可以更轻松地找到特定的键/值集,而不是需要迭代遍历才能找到特定元素的数组。 我该怎么做呢?

注意:这有效:

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

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

Zil*_*nas 6

If you are expecting only one result by both of your conditions then you could use User.findOne - it will return the first found result.

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

编辑

因为您说过需要获得2个结果,并且想要得到结果,所以您还可以并行运行2个查询,并使用promises获得结果。例如

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 ) );
});
Run Code Online (Sandbox Code Playgroud)

  • 你需要有 `const util = require('util');` 这是一个标准的 NodeJS 实用服务。在此处检查文档:https://nodejs.org/api/util.html (3认同)