为什么不能修改猫鼬查询返回的数据(例如:findById)


95

当我尝试更改猫鼬查询返回的数据的任何部分时,它均无效。

昨天,我尝试_.clone()使用各种s,使用临时存储变量等来解决大约2个小时的问题。最后,就在我发疯的时候,我找到了解决方案。所以我想以后有人(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);
            }
        });
    });
});


Answers:


161

对于这样的情况,您希望使用普通的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对象,您可以根据需要对其进行操作。


8
顺便说一句@JohnnyHK只是想再次感谢。一年半后,他正在帮助客户调试某些东西。他花了一个周末试图找出答案,结果是因为他试图修改猫鼬对象; P
Toli 2014年

1
2年后,仍然粉碎。甚至都没有意识到lean()在那儿。
Petrogad

1
@Fizzix aggregate始终以纯对象形式提供其结果,因此不需要lean()
JohnnyHK '16

1
3年后,花了整整一个小时试图弄清楚。救了我一整天!谢谢
Noy

2
谢谢!这确实有帮助,但是为什么不可能修改对象?这是什么样的特殊对象?
罗伯特·费德斯

46

我认为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);
            }
        });
    });
});

12
您还可以使用toObject(),其功能toJSON()与之相同,但名称较少混淆。
JohnnyHK

1
这也将摆脱开发人员提供的虚拟技术吗?
mjwrazor

5
TypeError: data.toObject is not a function我也知道了toJSON
Luzan Baral '18

result我没有进行修改,而是能够进行修改result._doc
nth-chile

@Luzan Baral那是因为您正在将这些函数用于Array对象。JSON.parse(JSON.stringify(data))改为使用对象数组
mohit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.