我遇到了一个我以前从未见过的问题,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);
    });

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

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

updateObj将进入如下状态:

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

回调返回的模型与原始模型相同,而不是updatedObj.

这感觉像是一个"愚蠢的用户"错误,但我看不出来.非常感谢您的任何 idea .

推荐答案

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

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

Node.js相关问答推荐

无法在我的 node 项目中转让Google Drive v3 API中的所有权

在Node.js下使用PostgreSQL客户端聚合PostgreSQL中的用户定义类型

如何从shell脚本中计算ecmascript模块?

聚合操作不返回任何具有mongoose模式的内容

"sh:/usr/local/bin/node:当它存在于文件目录中时未找到

获取驱动器文件夹的直接子文件夹时出现问题

我收到警告:发现函数rs-ms-v1不受支持的运行时nodejs18.x× 不受支持的运行时

Express Web 服务器部署到 prod 但 GET 返回超时错误

当try 将 formData 转换为 express js 时,服务器无法识别 multipart/form-data

Mongoose post中间件触发deleteMany

使用 Nodejs 获取 Firebase 云消息传递历史记录

如何解决这个关于 TaskRunner 的 Node/Express 代码问题?

在 NodeJS/ESP32 中通过 WebSocket 发送二进制数据 - 如何识别二进制和文本消息

为什么 JavaScript 的 parseInt(0.0000005) 打印5?

按日期时间字段获取最新的 MongoDB 记录

chart.js 无法创建图表:无法从给定项目获取上下文

Selenium WebDriver 等到元素显示

Node.js:如何附加到正在运行的进程并使用控制台调试服务器?

将 Heroku App 连接到 Atlas MongoDB 云服务

如何阻止 babel 将this转换为undefined(并插入use strict)