【问题标题】:Pushing Mongoose Results into Array将 Mongoose 结果推入数组
【发布时间】:2018-09-28 00:35:05
【问题描述】:

我正在尝试从“Books.find”中获取结果并将其推送到我的书籍数组中。然后我想重新发送。

我怀疑这与某种异步和范围垃圾有关。

解决办法是什么?

这是我目前的代码。

exports.timeline = function(req, res) {
    var Followers = mongoose.model('Follow');
    Followers.find({'follower': req.user.username}, function(err, followerResult) {
        var name = [req.user.username];
        var books = [];

        function addName(username) {
            name.push(username);
        }

        for(var user in followerResult) {
            addName(followerResult[user]['followed']);
        }

        function getDataByUsername(username) {
            function addBookArray(result) {
                books.push(result);
                return result;
            }

            var Books = mongoose.model('Book');
            Books.find({'username': username}).exec(function (err, result) {
                addBookArray(result);
            });
        }

        for(var usernames in name) {
            getDataByUsername(name[usernames]);
        }

        console.log(books);
        res.send(books);
    });
}

【问题讨论】:

标签: node.js mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

你是对的,问题是 Find 是异步的,你在收到结果之前就发送了响应。

要处理此类问题,您有多种选择:

  • 强大的包Async 用于组织您的异步循环
  • MongoDB 的aggregation 让您的数据库加入您的数据

【讨论】:

    【解决方案2】:

    Node Js 是异步的。您的代码永远不会等待您的查询结果。

    以下是您可以尝试的一些选项:

    承诺示例:-

    Promise.all([qry1, qry2]).then(res=>{ console.log(res)  }).catch(err=>{console.log(err);})
    

    这里 qry1 和 qry2 是你的 mongo 查询

    【讨论】:

      【解决方案3】:

      如果您不想使用 async 包,可以尝试使用 mongoose 和 mongodb 的 $in 功能。如,您获取用户列表,然后在用户列表中找到用户 ID 所在的书籍列表。 类似的东西:

      exports.timeline = function(req, res) {
      var Followers = mongoose.model('Follow');
      Followers.find({'follower': req.user.username}, function(err, followerResult) {
          var name = [req.user.username];
          var books = [];
      
          function addName(username) {
              name.push(username);
          }
      
          for(var user in followerResult) {
              addName(followerResult[user]['followed']);
          }
          Books.find({"username" : { $in: name }}).exec(function (err, books) {
             console.log(books);
             res.send(books);
          });
      });
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2023-04-11
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        相关资源
        最近更新 更多