findOneAndUpdate与returnNewDocument一起使用:true返回原始文档MongoDB

Kan*_*iya 28 javascript mongodb node.js express

我正在使用带有节点js的MongoDB npm install mongodb

我想更新现有文档并返回更新的文档,文档正确更新.但它返回旧文档意味着更新前的原始文档.我使用了returnNewDocument:true参数但没有用.

            var filter = {
                '_id': object_id
            },
            update = {
                $set: { "status" : data["status"] },
                $push: {
                    "statusHistory": {
                        $each: [{ status:data["status"],statusChangedTime:data["statusChangedTime"],comment:data["comment"]}],
                        $position:0,
                    }
                },
            }
            ,options = {
                //upsert: false,
                //multi: false,
                returnNewDocument: true
            };

            col.findOneAndUpdate(filter, update, options,function(err, res) {
                if (err) {

                    console.log(err);
                }else {

                    console.log(res);
                }
            });
Run Code Online (Sandbox Code Playgroud)

反应是

{ lastErrorObject: { updatedExisting: true, n: 1 },
  value: 
   { 
//original document
   },     
  ok: 1 }
Run Code Online (Sandbox Code Playgroud)

当我直接通过终端去mongoDB并尝试

db.MyCollection.find().pretty();
Run Code Online (Sandbox Code Playgroud)

文档正确更新,它只返回原始文件而不是更新的文件.

被困在这里2个小时,任何帮助表示赞赏

在package.json中

"mongodb": "^2.1.4",
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 79

Node.js 驱动程序文档没有提到returnNewDocument选项findOneAndUpdate()(这是具有相同名称的MongoDB shell命令的选项).

相反,它提到了一个名为的选项returnOriginal,默认为true.尝试使用该选项,将其设置false为返回更新的文档而不是原始文档.

  • 你是对的.令人遗憾的是,命名不一致也存在于mongodb中.希望他们能解决这个问题. (14认同)
  • 我必须使用 `new: true` 才能返回新文档。`returnOriginal: false` 和 `returnNewDocument: true` 对我不起作用。使用 Node v10.12.0 和 mongoose 5.3.14。 (3认同)
  • 在这个问题上损失了1个小时。多谢。 (2认同)

Tha*_*ija 9

如果您看到的是最新的2018年版本,则returnNewDocument:true和returnOriginal:false均无效。您必须改为在查询的选项对象中的{..,new:true}中将名为new的属性设置为true。


Nav*_*esh 8

要在执行更新操作后获取更新的文档,我们需要将该选项"returnDocument" : "after""returnOriginal" : false.

根据最新的 mongodb node driver v3.6文档,不推荐使用 returnOriginal。但是当我尝试只包括"returnDocument" : 'after'而不"returnOriginal":false返回原始记录而不是更新的记录时。使用它们都可以提供所需的更新记录输出,而不是原始记录。(来源:http : //mongodb.github.io/node-mongodb-native/3.6/api/Collection.html#findOneAndUpdate

该选项 "returnNewDocument" : true是一个 mongo shell 选项,根据官方 mongodb 文档(此处提到https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/)可能无法在节点驱动程序中工作

  • 效果非常好(2021 年)!这个答案需要获得更多点赞 (3认同)

Zac*_*ith 8

=== 2021 年 8 月

随着 Node.js 客户端 v4 的发布,旧的解决方案returnOriginal: false(无论如何都很糟糕)似乎不再是正确的答案。

要查看 node.js findOneAndUpdate 方法的可用选项列表:https://mongodb.github.io/node-mongodb-native/4.0/interfaces/findoneandupdateoptions.html

但简而言之,这应该有效:

const doc = await <Collection>.findOneAndUpdate(
  { ... search },
  {
    $set: {
      field1: 'value 1',
      field2: ['value 2'],
      etc.
    },
  },
  {
    upsert: true,
    returnDocument: 'after', // this is new !
  }
)
Run Code Online (Sandbox Code Playgroud)


小智 7

节点的js MongoDB的驾驶员已分化形式蒙戈外壳命令.如果你使用"mongodb":"^ 2.1.4"然后使用

returnOriginal:false

代替

returnNewDocument:true

.

我们来看下面的代码:

db.collection('user_setting').findOneAndUpdate({user_id: data.user_id}, {$set: data}, {projection: dbConfig.userSetting, returnOriginal: false}, function (err, res) {
        if (err) {
            callback({'error': 1, 'message': 'Internal server error! ' + err, 'data': null, 'status': 500});
        }   else {
                 console.log(res);
                /* { lastErrorObject: { updatedExisting: true, n: 1 },
                      value: 
                           { user_id: 1,
                             notification_alert: 1,
                             notification_sound: 1,
                             user_setting_id: 2 
                            },
                       ok: 1 
                  }      */       
        }
    });
Run Code Online (Sandbox Code Playgroud)