mongoosefindOne里面循环
我有一个document
Users
将storage
属性定义为引用其他document
称为Storage
的ObjectId
数组。 我想获得一个特定的用户,然后返回数组内的存储信息。
这是我的代码:
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); }); }