【问题标题】:Mongoose find result and then replace field with findOneMongoose 查找结果,然后用 findOne 替换字段
【发布时间】:2015-06-29 16:11:31
【问题描述】:

我是 mongodb 的新手,来自关系数据库,没有加入,继续使用 mongodb 对我来说是一种痛苦。

我想在这里存档的是获取所有项目并使用正确的项目类型名称而不是项目类型 ID 更新 projectType。不知何故,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' });
};

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

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

    【讨论】:

    • 我自己想出了很棒的答案,但这更好,正要发布我自己的答案,但这更好!
    • 再次非常感谢您的详细解答,冰雹!
    • @bluebill1049 不用担心,很高兴能为您提供帮助。我不得不修改第二种方法,因为它有一些错误。
    猜你喜欢
    • 2021-02-12
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多