【问题标题】:How to run a Mongoose query for each result to aggregate the data?如何为每个结果运行 Mongoose 查询以聚合数据?
【发布时间】:2019-05-24 04:58:51
【问题描述】:

我想知道用户是否喜欢一本书,并根据我视图中结果中的状态(喜欢/不喜欢)显示一颗心。

问题在于第二个查询的值在该函数之外不可用。

我尝试在内部使用异步函数,但没有返回任何结果。我还尝试将书籍添加到数组中并返回它,这给出了一个空数组。

var bookQuery = Book.find({ title: req.body.title}, {}, { skip: 0, limit: 200 })
.sort({ name: 1 });

bookQuery.lean().exec(function (err, books) {
  books = books.map(function (book) {
    Like.findOne({ object: book._id, likedby: req.session.passport.user }).exec(function (err, like) {
      book.liked = (like != null) ? 1 : 0;
      // Here it's available
    });

    return book;
  });

  cb(books);
}, cb);

我想为每本书添加一个字段,其中包含来自 Like 查询的值。 现在它只显示书籍。

【问题讨论】:

    标签: node.js express mongoose mongoose-schema


    【解决方案1】:

    因此,您知道 Node JS 中的很多事情都是异步的,因此您无法从回调函数之外获取结果。对于回调,您可以只使用async 模块以避免callback hellsasync 模块在 Node JS 开发人员中非常流行,所以如果你使用回调,我强烈建议使用 async。它有几十种方法可以促进和繁荣您的代码。

    然而,ES6 带来了许多新的有用的功能。这些功能之一是Promise。它是基于回调开发的,并且可以轻松编写异步函数。还有一种克服异步函数的简单方法是async/await。其实有generator functions

    【讨论】:

    • 感谢您的评论。是的,我知道 Node.js 中的异步,并且已经在 Like.findOne 上尝试了异步/等待,但我无法让它工作,并且 map 函数不能是异步的。把书拿出来展示效果很好,我只是无法添加类似的部分。
    • 我似乎无法在网上找到任何关于在 Mongoose 中运行嵌套查询的示例,就像我在上面尝试做的那样。你能举个例子吗?
    猜你喜欢
    • 2013-05-14
    • 2011-10-21
    • 2020-03-17
    • 2014-10-22
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    相关资源
    最近更新 更多