Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么可以';t修改Mongoose查询返回的数据(例如:findById)_Node.js_Mongoose - Fatal编程技术网

Node.js 为什么可以';t修改Mongoose查询返回的数据(例如:findById)

Node.js 为什么可以';t修改Mongoose查询返回的数据(例如:findById),node.js,mongoose,Node.js,Mongoose,当我试图更改Mongoose查询返回的数据的任何部分时,它没有任何效果 昨天我花了大约两个小时试图解决这个问题,使用了各种各样的\uuu.clone()s,使用了临时存储变量,等等。最后,就在我觉得自己快要发疯的时候,我找到了一个解决方案。所以我想未来可能会有人(fyuuture!)会有保存问题 Survey.findById(req.params.id, function(err, data){ var len = data.survey_questions.length; v

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

昨天我花了大约两个小时试图解决这个问题,使用了各种各样的
\uuu.clone()
s,使用了临时存储变量,等等。最后,就在我觉得自己快要发疯的时候,我找到了一个解决方案。所以我想未来可能会有人(fyuuture!)会有保存问题

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

我认为Mongoose文档没有足够清楚地说明这一点,但是查询中返回的数据(尽管您可以res.send()它)实际上是一个Mongoose文档对象,而不是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);
            }
        });
    });
});

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

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对象,您可以根据需要进行操作。

Btw@johnyhk只是想再次表示感谢。一年半后,他正在帮助一个客户调试一些东西。他花了一个周末试图弄明白一些事情,结果是因为他试图修改猫鼬的物体;P2年后,它仍在被摧毁。甚至没有意识到精益()的存在。@Fizzix
aggregate
总是以普通对象的形式提供结果,所以没有必要在三年后花费整整一个小时来尝试解决它。救了我一整天!谢谢你!这确实有帮助,但是为什么不可能修改对象呢?它是什么类型的特殊对象?你也可以使用它,它的功能与
toJSON()
相同,但名称不太容易混淆。这也会消除开发人员使用的虚拟对象吗?
TypeError:data.toObject不是一个函数
我得到了这个,与
toJSON
一样,而不是修改
结果
,我可以修改
结果。_doc
@Luzan Baral这是因为您正在对数组对象使用这些函数。使用
JSON.parse(JSON.stringify(data))
代替object数组