我有一个 document
Users
,storage
属性定义为引用其他 的
称为 ObjectId
数组>documentStorage
。我正在尝试获取特定用户,然后返回数组中的存储信息。
这是我的代码:
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/