web-dev-qa-db-ja.com

returnNewDocument:trueで使用されるfindOneAndUpdateは、元のドキュメントMongoDBを返します

私はノード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",

Node.js ドライバーのドキュメント は、findOneAndUpdate()returnNewDocumentオプションについて言及していません(これは MongoDB Shellコマンドのオプションです 同じ名前)。

代わりに、returnOriginalと呼ばれるオプションについて言及しています。デフォルトではtrueです。そのオプションを使用してみてください。falseに設定すると、元のドキュメントではなくupdatedドキュメントが返されます。

75
robertklep

この最新の2018年が表示されている場合、returnNewDocument:trueもreturnOriginal:falseも機能しません。代わりに、クエリのオプションオブジェクトの{..、new:true}のように、newと呼ばれるプロパティをtrueに設定する必要があります。

8

node js mongoDb driver は、mongo Shellコマンドからの差別化です。 "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 
                  }      */       
        }
    });
6
yogesh kumar

Mongooseセットアップで{ returnOriginal: false }を使用しているときに他の誰かがこの問題に遭遇した場合:

Mongooseは{ new: true }ではなく{ returnOriginal: false }を使用します。

機能はここで参照されています: Mongoose:findOneAndUpdateは更新されたドキュメントを返しません および Mongoose docs 内:

オプション:

new:bool-trueの場合、元のドキュメントではなく変更されたドキュメントを返します。デフォルトは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);
  }
});
0
jamesmhaley

私はマングースを使用しています:5.8.9

以下の行で

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

そしてこれは働いています

0
Aljohn Yamaro