猫鼬findByIdAndUpdate没有返回正确的模型


98

我有一个我以前从未见过的问题,猫鼬的findByIdAndUpdate没有在回调中返回正确的模型。

这是代码:

    var id = args._id;
    var updateObj = {updatedDate: Date.now()};
    _.extend(updateObj, args);

    Model.findByIdAndUpdate(id, updateObj, function(err, model) {
        if (err) {
            logger.error(modelString +':edit' + modelString +' - ' + err.message);
            self.emit('item:failure', 'Failed to edit ' + modelString);
            return;
        }
        self.emit('item:success', model);
    });

数据库中的原始文档如下所示:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 1'
}

进入的updateObj如下所示:

{
    _id: 1234
    descriptors: Array[2],
    name: 'Test Name 2'
}  

从回调返回的模型与原始模型相同,而不是updatedObj。如果我查询数据库,它已正确更新。它只是没有从数据库中返回。

这感觉像是一个“愚蠢的用户”错误,但我看不到它。任何想法表示赞赏。


1
那是一个很棒的地方。并提醒一下为什么我需要保持我所有项目在版本上的匹配,因为那个包正在通过它自己的单元测试。谢谢。
JonRed

Answers:


292

在Mongoose 4.0中,(和)new选项的默认值已更改为(请参阅发行说明的#2262 )。这意味着在应用更新后,您需要显式设置选项以获取新版本的文档:findByIdAndUpdatefindOneAndUpdatefalsetrue

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...

4
也被'create'方法的返回值更改所吸引。朋友们,加油,如果可以的话,我会投票两次。
JonRed

4
还为猫鼬项目添加了更新文档的PR,因此希望它不会吸引其他任何人。
JonRed

3
哦,男孩,谢谢@JohnnyHK。这让我感到震惊。当然我要新的回来。也许与API更加一致,但实际上与常识并不完全一致……如果我进行更新,则希望看到更改。谢谢猫鼬……
Peege151

20
哇!他们做出了多么可怕的决定!这是首先查找而不是更新的唯一目的。
亚当·洛克哈特

9
我不明白为什么有人宁愿在响应中使用旧文档而不是新文档
emilioriosvz
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.