javascript - Mongoose findOne 内部循环

标签 javascript node.js mongodb mongoose

我有一个 document Usersstorage 属性定义为引用其他 ObjectId 数组>document 称为 Storage。我正在尝试获取特定用户,然后返回数组中的存储信息。

这是我的代码:

module.exports.storageDetail = function(req, res) {
      User.findOne({'userId': req.user.userId}, 'storages').then(function(data){
        var storageArray = [];

        data.storages.forEach(function(record){
          Storage.findOne({_id: record}, function(err, storage){
            storageArray.push(storage);
          });
        });

        return Promise.all(storageArray);
      }).then(function(storageList){
        res.render('storage_template', {
          storage: storageList
        });
        console.log(storageList);
      });
}

但是执行后,storageList是一个空数组。

我是 node.js 的新手,如果我需要提供更多信息,请告诉我。

最佳答案

所以这里的重点是你需要.exec()为了返回 promise 。这就是您的尝试失败的原因。但在句法上也有更好的方法。

改为使用 .map()并调用.exec()返回 promise

User.findOne({'userId': req.user.userId}, 'storages').then(function(data){
  var storageArray = data.storages.map(function(id) { 
    return Storage.findOne({_id: id }).exec() 
  });
  return Promise.all(storageArray);
}).then(function(storageList){
  res.render('storage_template', {
    storage: storageList
  });
  console.log(storageList);
});

或者改用 $in.find()其中该方法返回一个数组,运算符允许您指定要匹配的事物的数组:

User.findOne({'userId': req.user.userId}, 'storages').then(function(data){
  return Storage.find({ "_id": { "$in": data.storages } }).exec();
}).then(function(storageList){
  res.render('storage_template', {
    storage: storageList
  });
  console.log(storageList);
});

基本上看起来您也可以简单地使用 .populate()

User.findOne({'userId': req.user.userId}, 'storages')
  .populate('storages')
  .then(function(data) {
    res.render('storage_template', {
      storage: data.storages
    });
    console.log(data.storages);
  });

但是您的问题中并不清楚这些是否实际上定义为对 Storage 模型的引用。

另见 Queries are not Promises在 Mongoose 文档中。

关于javascript - Mongoose findOne 内部循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44499299/

相关文章:

javascript - 为什么重复元素返回未定义?

javascript - 鼠标悬停时的元素 id

node.js - 在 Nodejs 缓冲区中写入位

javascript - 如何将 $scope 设置为特定的 MongoDB 文档

node.js - MongoDB - 查询ObjectId嵌套数组

database - 使用mgo golang mongodb动态插入多个文档

javascript - jQuery onfocus 和 onblur 事件缩小

javascript - AngularJS 不拦截来自地址栏的直接请求

javascript - 返回从循环中调用的数据库查询中检索到的数据的问题

javascript - Dojo 要求不工作