【问题标题】:Mongoose findByIdAndUpdate not returning correct model猫鼬 findByIdAndUpdate 没有返回正确的模型
【发布时间】:2015-08-05 19:50:40
【问题描述】:

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

db中的原始文档是这样的:

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

进入的updateObj如下所示:

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

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

这感觉像是一个“愚蠢的用户”错误,但我看不到。任何想法都非常感谢。

【问题讨论】:

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

标签: node.js mongodb mongoose


【解决方案1】:

在 Mongoose 4.0 中,findByIdAndUpdate(和findOneAndUpdate)的new 选项的默认值已更改为false,这意味着返回旧文档(参见release notes 的#2262)。因此,在应用更新后,您需要将选项显式设置为true 以获取新版本的文档:

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

【讨论】:

  • 也被 'create' 方法的返回值的变化所吸引。干杯哥们,如果可以的话,我会投票两次。
  • 还为 mongoose 项目的更新文档提交了 PR,所以希望它不会赶上其他人。
  • 天哪,谢谢@JohnnyHK。这让我崩溃了。我当然想要新的回来。可能与 API 更一致,但与常识不符……如果我更新某些内容,我希望看到更改。谢谢猫鼬...
  • 哇!他们做出了多么可怕的决定!这是首先进行查找而不是更新的唯一要点。
  • 我不明白为什么有人宁愿在响应中使用旧文档而不是新文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2017-01-16
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多