我遇到了一个我以前从未见过的问题,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相关问答推荐

JsonwebToken过期后如何注销和清除cookie?

如何修复PostgreSQL和NodeJS/NestJS应用程序之间的日期时间和时区问题?

当变量在另一个文件中初始化时,在初始化错误之前无法访问变量

Rest-Api动态图像路径和Express除非

Node.js 连接在查询完成之前终止

TypeScript Eslint警告了一个AWS客户端构造函数(dynamodb),但没有警告另一个(s3)

如何设置 Puppeteer Select 器的唯一性?

无法截取页面截图

我如何保护nodejs中的路由

对 google api v3 的 Axios 请求返回加密(?)数据

将 express js app.use() 移动到另一个文件

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

用户与mongoose 的完美搭配

当我们有esnext时,为什么我们需要nodenext typescript 编译器选项?

Node.js 服务器中没有缓存

在 Mongoose 中创建外键关系

在 Node 中连接和缩小 JS 文件

Heroku + Node:找不到模块错误

未在 Windows 8.1 上构建的 node 包 - 缺少 Microsoft.Cpp.Default.props

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?