FindOneAndUpdate используется с returnNewDocument: true возвращает исходный документ MongoDB

Я использую MongoDB с узлом js, я использовал 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",

Ответ 1

Документация драйвера Node.js не упоминает параметр returnNewDocument для findOneAndUpdate() (который является опцией для команда оболочки MongoDB с тем же именем).

Вместо этого в нем упоминается опция returnOriginal, которая по умолчанию имеет значение true. Попробуйте использовать этот параметр, установив его на false, чтобы вернуть обновленный документ вместо оригинала.

Ответ 2

Если вы видите этот последний 2018 год, ни returnNewDocument: true, ни returnOriginal: false не работает. Вместо этого вы должны установить свойство с именем new в true, как в {.., new: true} в объекте option для вашего запроса.

Ответ 3

узел js mongoDb driver был командой дифференцирования формы mongo. Если вы используете "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 
                  }      */       
        }
    });

Ответ 4

Если кто-то столкнулся с этой проблемой при использовании { returnOriginal: false } в настройке Mongoose:

Mongoose использует { new: true } вместо { returnOriginal: false }.

Ссылка на эту функцию приведена здесь: Mongoose: findOneAndUpdate не возвращает обновленный документ и в документы Mongoose:

Options:

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