我是mongodb的新手,来自关系数据库,没有加入,我继续使用mongodb很痛苦。
我想在此处存档的是获取所有项目并使用正确的项目类型名称更新projectType,而不是项目类型ID。以某种方式,projects.attrubtes不能覆盖。然后我尝试了以下帖子。没有运气。任何帮助表示赞赏。任何人都可以给我一些指导,我将不胜感激。
Why can't you modify the data returned by a Mongoose Query (ex: findById)
var _ = require('lodash');
var project = require('./project.model');
var Form = require('../form/form.model');
// Get list of projects
exports.index = function(req, res) {
project.find(function (err, projects) {
if(err) { return handleError(res, err); }
_.each(projects, function(element, index){
Form.findOne({_id : projects[index].projectType}, '-formContent -_id -createdDateTime', function(error, form){
if(form !== undefined) projects[index].projectType = form.formName;
});
});
return res.json(200, projects);
}).sort({ createdDateTime: 'desc' });
};
答案 0 :(得分:3)
Mongoose documents 不允许添加属性。您需要在 exec()
之前调用lean()
方法,因为启用了精益选项的查询返回的文档是纯JavaScript对象或将返回的文档强制转换为普通对象:
来自 docs :
project.find().lean().exec(function (err, projects) {
projects[0] instanceof mongoose.Document // false
});
所以你的代码应该是这样的:
project.find()
.lean()
.exec(function (err, projects) {
if(err) { return handleError(res, err); }
_.each(projects, function(element, index){
Form.findOne(
{_id : projects[index].projectType},
'-formContent -_id -createdDateTime',
function(error, form){
if(form !== undefined) projects[index].projectType = form.formName;
}
);
});
return res.json(200, projects);
}).sort({ createdDateTime: 'desc' });
或将返回的文档强制转换为普通对象:
project.find()
.exec(function (err, docs) {
if(err) return res.send(err);
var projects = [];
_.each(docs, function(item, i) {
var obj = item.toObject();
Form.findOne(
{_id : docs[i].projectType}, /* {_id : item.projectType} */
'-formContent -_id -createdDateTime',
function(error, form){
if(form !== undefined) {
obj.projectType = form.formName;
projects.push(obj);
}
}
);
});
res.send(projects);
});