以下は私のコードです
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var Cat = mongoose.model('Cat', {
name: String,
age: {type: Number, default: 20},
create: {type: Date, default: Date.now}
});
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
if(err){
console.log("Something wrong when updating data!");
}
console.log(doc);
});
mongo データベースにはすでにレコードがいくつかあるので、このコードを実行して、年齢が 17 である名前を更新し、コードの最後に結果を出力したいと思います。
しかし、なぜコンソールからは同じ結果(変更された名前ではない)が返されるのに、mongo db コマンドラインに移動して「db.cats.find();
」と入力すると、変更された名前で結果が返されるのでしょうか。
その後、このコードを再度実行すると、結果が変更されます。
私の質問は、データが変更された場合、console.log に最初に記録したときに元のデータがまだ取得されるのはなぜかということです。
ベストアンサー1
なぜこのようなことが起こるのでしょうか?
デフォルトでは、変更されていない元のドキュメントが返されます。新しい更新されたドキュメントが返されるようにするには、追加の引数として、new
プロパティが に設定されたオブジェクトを渡す必要がありますtrue
。
からマングースドキュメント:
クエリ#findOneAndUpdate
Model.findOneAndUpdate(conditions, update, options, (error, doc) => { // error: any errors that occurred // doc: the document before updates are applied if `new: false`, or after updates if `new = true` });
利用可能なオプション
new
: bool - trueの場合、元のドキュメントではなく変更されたドキュメントを返します。デフォルトは false です(4.0 で変更)
解決
{new: true}
変数に更新された結果が必要な場合はパスしますdoc
:
// V--- THIS WAS ADDED
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, (err, doc) => {
if (err) {
console.log("Something wrong when updating data!");
}
console.log(doc);
});