sql >> データベース >  >> NoSQL >> MongoDB

更新を決定するマングース-upsertが挿入または更新を行っている

    .update() mongooseのメソッドは、コールバックに対して3つの引数を取ります。errnumAffected 、およびraw 応答。 「生の」オブジェクトを使用して、何が起こったかを確認します。

    Member.update({user_id : 1}, 
        {$set : {name:"name1"}}, 
        {upsert : true }, 
        function (err, numAffected, raw) {
        if (!err) {
            console.log(raw)
        }
    });
    

    次のような構造が表示されます:

    { ok: true,
      n: 1,
      updatedExisting: false,
      upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }
    

    したがって、常にnがあります および'updatedExistingkeys available, where the second is false on upserts and true otherwise. upsertedwill contain theが含まれます 作成された新しいドキュメントの_id`値。

    nについて または「numAffected」の場合、これは基本的に常に1であり、従来の書き込み懸念応答の下でドキュメントが一致しました。

    一括操作フォームを使用して、MongoDB2.6以降で新しいWriteResult応答を確認できます。

    var bulk = Member.collection.initializeOrderedBulkOp();
    bulk.find({user_id : 1}.upsert().update({$set : {name:"name1"}});
    bulk.execute(err,result) {
       console.log( JSON.stringify( result, undefined, 2 ) );
    }
    

    最初の反復で次のようなものが得られます:

    {
      "ok": 1,
      "writeErrors": [],
      "writeConcernErrors": [],
      "nInserted": 0,
      "nUpserted": 1,
      "nMatched": 0,
      "nModified": 0,
      "nRemoved": 0,
      "upserted": [
        {
          "index": 0,
          "_id": "5456fff138209001a6b5e1c0"
        }
      ]
    }
    

    そして、次のような同じパラメータを持つ秒:

    {
      "ok": 1,
      "writeErrors": [],
      "writeConcernErrors": [],
      "nInserted": 0,
      "nUpserted": 0,
      "nMatched": 1,
      "nModified": 0,
      "nRemoved": 0,
      "upserted": []
    }
    

    また、ドキュメントは、実際に何かが変更された場合にのみ「変更済み」としてマークされます。

    とにかく、.update() 操作は、変更されたドキュメントまたは元のドキュメントを返しません。それが.findOneAndUpdate()です メソッド、基本的な.findAndModify()のマングースラッパー アトミック操作を実行します。 .update() メソッドは通常、一括操作を目的としているため、ドキュメントのコンテンツは返されません。



    1. MongoDBを使用して不変のデータを保存しますか?

    2. undoUnwindをmongodbでまとめて

    3. マングース--findByIdAndUpdate--はreq.bodyでは機能しません

    4. 投稿と共有のためのMongodbスキーマ