私はノード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ドキュメントが返されます。
この最新の2018年が表示されている場合、returnNewDocument:trueもreturnOriginal:falseも機能しません。代わりに、クエリのオプションオブジェクトの{..、new:true}のように、newと呼ばれるプロパティをtrueに設定する必要があります。
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
} */
}
});
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);
}
});
私はマングースを使用しています:5.8.9
以下の行で
const option = { new: true }
const account = await Account.findOneAndUpdate(filter, update, option)
そしてこれは働いています