?????? Mongoose ???????(??:findById)

Posted

技术标签:

【中文标题】为啥不能修改 Mongoose 查询返回的数据(例如:findById)【英文标题】:Why can't you modify the data returned by a Mongoose Query (ex: findById)为什么不能修改 Mongoose 查询返回的数据(例如:findById) 【发布时间】:2013-01-08 09:19:31 【问题描述】:

当我尝试更改 Mongoose 查询返回的数据的任何部分时,它没有任何效果。

昨天我试图解决这个问题大约 2 小时,各种_.clone()s,使用临时存储变量等。最后,就在我发疯的时候,我找到了解决方案。所以我认为将来有人(fyuuuture!)可能会遇到保存问题。

Survey.findById(req.params.id, function(err, data)
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq)
        Question.findById(sq.question, function(err, q)
            sq.question = q; //has no effect

            if(++counter == len) 
                res.send(data);
            
        );
    );
);

【问题讨论】:

How do you turn a Mongoose document into a plain object?的可能重复 ***.com/q/9952649/4748042的可能重复 【参考方案1】:

对于这样的情况,您需要一个普通的 JS 对象而不是完整的模型实例,您可以像这样在查询链上调用 lean()

Survey.findById(req.params.id).lean().exec(function(err, data)
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq)
        Question.findById(sq.question, function(err, q)
            sq.question = q;

            if(++counter == len) 
                res.send(data);
            
        );
    );
);

这样data已经是一个普通的JS对象,你可以根据需要进行操作。

【讨论】:

顺便说一句 @JohnnyHK 只是想再次表示感谢。一年半后帮助客户调试了一些东西。他花了一个周末试图弄清楚一些事情,原来是因为他试图修改 Mongoose 对象;P 2 年过去了,但仍然在粉碎它。甚至没有意识到lean() 在那里。 @Fizzix aggregate 始终将其结果作为普通对象提供,因此不需要lean() 3 年后,花了整整一个小时试图弄清楚。拯救了我的一整天!谢谢 谢谢!这确实有帮助,但是为什么无法修改对象呢?它是一种什么样的特殊物体?【参考方案2】:

我认为 Mongoose 文档并没有说明这一点,但查询中返回的数据(尽管您可以 res.send() 它)实际上是 Mongoose Document 对象,而不是 JSON 对象。但是你可以用一行来解决这个问题......

Survey.findById(req.params.id, function(err, data)
    var len = data.survey_questions.length;
    var counter = 0;

    var data = data.toJSON(); //turns it into JSON YAY!

    _.each(data.survey_questions, function(sq)
        Question.findById(sq.question, function(err, q)
            sq.question = q;

            if(++counter == len) 
                res.send(data);
            
        );
    );
);

【讨论】:

您也可以使用toObject(),它与toJSON() 的作用相同,但名称不那么容易混淆。 这是否也能摆脱开发者使用的虚拟设备? TypeError: data.toObject is not a function我知道了,和toJSON一样 我没有修改result,而是修改了result._doc @Luzan Baral 那是因为您将这些函数用于 Array 对象。使用JSON.parse(JSON.stringify(data)) 代替对象数组

以上是关于?????? Mongoose ???????(??:findById)的主要内容,如果未能解决你的问题,请参考以下文章

mongoose入门以及 mongoose 实现数据 的增删改查

mongoose使用之查询篇

Mongoose 错误 - 具有相同型号名称的 Mongoose 型号

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

??node.js????Mongoose??????