web-dev-qa-db-ja.com

マングース:findOneAndUpdateが更新された文書を返さない

以下は私のコードです

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で最初の時点でまだ元のデータを取得している理由です。

202
Dreams

デフォルトオリジナル、変更なしドキュメントを返すことです。新しく更新された文書を返却したい場合は、追加の引数、newプロパティをtrueに設定したオブジェクトを渡す必要があります。

マングースドキュメントから

Query#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なら、オリジナルではなくmodifiedドキュメントを返します。 デフォルトはfalse(4.0で変更)

したがって、更新された結果をdoc変数に入れたい場合は、次のようにします。

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, (err, doc) => {
    if (err) {
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});
412
Cristy

Mongooseの代わりにNode.jsドライバを使っている人は、{returnOriginal:false}の代わりに{new:true}を使ったほうがいいでしょう。

50

デフォルトでは findOneAndUpdate は元のドキュメントを返します。変更した文書を返したい場合は、オプションオブジェクト{ new: true }を関数に渡します。

Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {

});
37

そのため、「findOneAndUpdate」には元の文書を返すオプションが必要です。そして、オプションは:

MongoDBシェル

{returnNewDocument: true}

参照: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/

マングース

{new: true}

参照: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate

Node.js MongoDBドライバAPI:

{returnOriginal: false}

参照: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate

34
Tsuneo Yoshioka

ネイティブの約束でES6/ES7スタイルを使用してこれに出会った人のために、ここではあなたが採用することができるパターンです...

const user = { id: 1, name: "Fart Face 3rd"};
const userUpdate = { name: "Pizza Face" };

try {
    user = await new Promise( ( resolve, reject ) => {
        User.update( { _id: user.id }, userUpdate, { upsert: true, new: true }, ( error, obj ) => {
            if( error ) {
                console.error( JSON.stringify( error ) );
                return reject( error );
            }

            resolve( obj );
        });
    })
} catch( error ) { /* set the world on fire */ }
12
Assaf Moldavsky

これはfindOneAndUpdateの更新されたコードです。できます。

db.collection.findOneAndUpdate(    
  { age: 17 },      
  { $set: { name: "Naomi" } },      
  {
     returnNewDocument: true
  }    
)
9
Jobin Mathew

変更された文書を返却したい場合は{new:true}オプションを設定する必要がありますCat.findOneAndUpdate(conditions, update, options, callback) // executes

公式のMongoose APIで撮影されています http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate 次のパラメータを使用できます

A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options)  // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update)           // returns Query
A.findOneAndUpdate()                             // returns Query

公式のAPIページでは表現されていないもう1つの実装は、さまざまなエラーをすべて処理できる.catchを使用できるPromiseベースの実装です。

    let cat: catInterface = {
        name: "Naomi"
    };

    Cat.findOneAndUpdate({age:17}, cat,{new: true}).then((data) =>{
        if(data === null){
            throw new Error('Cat Not Found');
        }
        res.json({ message: 'Cat updated!' })
        console.log("New cat data", data);
    }).catch( (error) => {
        /*
            Deal with all your errors here with your preferred error handle middleware / method
         */
        res.status(500).json({ message: 'Some Error!' })
        console.log(error);
    });
2
Jonathan Thurft

以下はmongooseのfindOneAndUpdateに対するクエリです。ここでnew: trueは更新されたドキュメントを取得するために使用され、fieldsは取得する特定のフィールドに使用されます。

例えば。 findOneAndUpdate(conditions, update, options, callback)

await User.findOneAndUpdate({
      "_id": data.id,
    }, { $set: { name: "Amar", designation: "Software Developer" } }, {
      new: true,
      fields: {
        'name': 1,
        'designation': 1
      }
    }).exec();
0
Sourabh Khurana