【问题标题】:How to get updated document back from the findOneAndUpdate method?如何从 findOneAndUpdate 方法中获取更新的文档?
【发布时间】:2016-06-08 03:40:12
【问题描述】:

我正在使用带有节点 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);
                }
            });

回应是

{ lastErrorObject: { updatedExisting: true, n: 1 },
  value: 
   { 
//original document
   },     
  ok: 1 }

当我通过终端直接进入mongoDB并尝试时

db.MyCollection.find().pretty();

文档已正确更新,它只返回原始文档而不是更新文档。

在这里停留了 2 小时,感谢任何帮助

在 package.json 中

"mongodb": "^2.1.4",

【问题讨论】:

  • 使用的是什么版本的mongodb? 3.2?

标签: javascript node.js mongodb express


【解决方案1】:

Node.js driver documentation 没有提到findOneAndUpdate()returnNewDocument 选项(这是同名MongoDB shell command 的选项)。

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

【讨论】:

  • 你是对的。不幸的是,命名不一致也影响了 mongodb。希望他们能修复它。
  • 太好了,解决了这个问题。非常感谢:) :)
  • 在这个问题上浪费了 1 小时。非常感谢。
  • @Sulliwane 你一定会得到一个不同的页面,因为它清楚地提到了returnOriginal (image)。
  • 我必须使用new: true 才能返回新文档。 returnOriginal: falsereturnNewDocument: true 对我不起作用。使用 Node v10.12.0 和 mongoose 5.3.14。
【解决方案2】:

与命令 findOneAndUpdate() 的原生 MongoDB shell 相比,NodeJS MongoDB driver 具有不同的参数。如果您使用的是“mongodb”:“^2.1.4”,请使用

returnOriginal: false

改为

returnNewDocument: 真

.

让我们看看下面的代码:

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 
                  }      */       
        }
    });

【讨论】:

    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

    如果其他人在 Mongoose 设置中使用 { returnOriginal: false } 时遇到此问题:

    Mongoose 使用 { new: true } 而不是 { returnOriginal: false }

    此处引用了该功能:Mongoose: findOneAndUpdate doesn't return updated documentMongoose docs 内:

    选项:

    new: bool - 如果为真,则返回修改后的文档而不是原始文档。默认为 false(在 4.0 中更改)

    所以当使用findOneAndUpdate 时,将new: true 添加到方法选项中:

    ...
    
    const options = {
      new: true
    };
    
    col.findOneAndUpdate(filter, update, options, function (err, res) {
      if (err) {
        console.log(err);
      } else {
        console.log(res);
      }
    });
    

    【讨论】:

      【解决方案5】:

      我正在使用 猫鼬:5.8.9

      下面这些行

      const option = { new: true }
      const account = await Account.findOneAndUpdate(filter, update, option)
      

      这是有效的

      【讨论】:

        【解决方案6】:

        这对我有用。

        req.db.collection(collectionName).findOneAndUpdate(
                  { _id : commentById._id }, // matching parameters
                   updateOpts, //updating parameters
                  {returnOriginal: false}  //don't use **returnNewDocument**
                 );
        

        【讨论】:

          【解决方案7】:

          根据 4.0+ 的实际源代码和类型定义,new 属性现在是 new。设置true返回修改后的结果。

          interface QueryFindOneAndUpdateOptions extends QueryFindOneAndRemoveOptions {
            /** if true, return the modified document rather than the original. defaults to false (changed in 4.0) */
            new?: boolean;
            ...
          

          【讨论】:

            【解决方案8】:

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

            根据最新的 mongodb 节点驱动程序 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 年)!这个答案需要得到更多的支持
            • 完美。省时间。 :-)
            • 感谢您的回答。它节省了我的时间
            【解决方案9】:

            === 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 !
              }
            )
            

            【讨论】:

            • 如果您在 2021 年 8 月更新了 mongodb 驱动程序,这是正确的。让我头痛了 60 分钟。谢谢@Zach!
            猜你喜欢
            • 2022-11-02
            • 2019-07-20
            • 1970-01-01
            • 2014-02-26
            • 2022-01-22
            • 1970-01-01
            • 2019-03-06
            • 1970-01-01
            • 2017-08-13
            相关资源
            最近更新 更多