【问题标题】: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);
            }
        });
    });
});

【问题讨论】:

标签: node.js mongoose


【解决方案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)) 代替对象数组
猜你喜欢
  • 2015-11-14
  • 2020-04-12
  • 2018-05-22
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
相关资源
最近更新 更多