1. ホーム
  2. node.js

[解決済み】Mongoose: findOneAndUpdateが更新されたドキュメントを返さない

2022-03-25 14:14:02

質問

以下は私のコードです。

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(); となります。結果は修正された名前で出てきました。

その後、もう一度このコードを実行すると、結果が修正されています。

質問ですが、もしデータが変更されたのなら、なぜ最初のコンソール.logでは元のデータが残っているのでしょうか?

どうすればいいですか?

なぜこのようなことが起こるのでしょうか?

デフォルト を返すことです。 元の、変更されていない ドキュメントを作成します。もし新しく更新されたドキュメントを返したい場合は、追加の引数を渡さなければなりません。 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 - if を返します。 修正済み ドキュメントを返します。 デフォルトは 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);
});