Mongoose找到结果,然后用findOne替换字段

时间:2015-06-29 02:21:25

标签: mongodb mongoose

我是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' });
};

1 个答案:

答案 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); 
    });