mongoosefindOne里面循环

我有一个document Usersstorage属性定义为引用其他document称为StorageObjectId数组。 我想获得一个特定的用户,然后返回数组内的存储信息。

这是我的代码:

 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模型的引用,这个问题还不清楚。

另请参阅mongoose文档中的查询不是承诺 。

如果您正在使用mongoose,那么您可以使用.populate()Storage集合中获取storages信息的详细信息。

可以试试这个

 module.exports.storageDetail = function(req, res) { User.findOne({'userId': req.user.userId}, 'storages') .populate('storages') .exec(function (err, storageList) { if (err) return handleError(err); console.log(storageList); res.render('storage_template', { storage: storageList }); }); } 

为了使用这个.populate()确保您的User模型中首先添加了ref存档

喜欢:

 storages: [{ type: Schema.Types.ObjectId, ref: 'Storage' }] 

//做npm安装lodash

 const _ = require('lodash'); module.exports.storageDetail = function(req, res) { User.findOne({'userId': req.user.userId}, 'storages').then(function(data){ var storageArray = []; let queries = _.map(data.storages, (record)=>{ return Storage.findOne({_id: record}, function(err, storage){ storageArray.push(storage); }); }) return Promise.all(queries); }).then(function(storageList){ res.render('storage_template', { storage: storageList }); console.log(storageList); }); }