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