【问题标题】:Execute multiple queries at once in Mongoose在 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 是我想要的文档数组。但是,我想知道是否有更好的方法。

【问题讨论】:

    标签: javascript arrays mongodb object mongoose


    【解决方案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
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2019-03-25
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多