2017-05-01 17 views
0

特定のサブ文書(複数)を更新したいのですが、そのために2つの方法があります。私はどちらが良いか知りたい。MongoDBのサブ文書を更新する方が良い

サンプル文書

{ 
    _id: 1, 
    doc: [{ 
     prop1: false, 
     prop2: 1 
    },{ 
     prop1: false, 
     prop2: 1 
    },{ 
     prop1: true, 
     prop2: 2 
    }] 
} 

方法1:

db.docs.findOne({}, function(err, result){ 
    if(err || !result) return next(err || []); 
    result.doc.forEach(function(doc){ 
     if(doc.prop2 === 1){ 
     doc.prop1 = true; 
     } 
    }); 
    doc.save(); 
}); 

方法2:

db.docs.findOne({_id: 1}, function(err, result){ 
    if(err || !result) return next(err || []); 
    var bulk = db.docs.initializeUnorderedBulkOp(); 
    result.doc.forEach(function(doc){ 
     if(doc.prop2 === 1){ 
     bulk.find({ 
      _id: 1, 
      "doc.prop2": 1 
      }).update({ 
       $set: { 
        "doc.$.prop1": true 
       } 
      }); 
     } 
    }); 
    bulk.execute(); 
}); 

示唆してください。質問があればお知らせください。

+0

$ unwind(https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/)を使用すると、入力文書から配列フィールドを分解して各要素の文書を出力できます。各出力ドキュメントは、配列フィールドの値を要素で置き換えた入力ドキュメントです。 –

+0

@Blastfreak $ unwindは集約サイクルの演算子です。ここでは、複数のサブ文書を更新しようとしています。それらを単純な形式で検索するのではありません。だからちょうど複数のサブ文書を更新するより良い方法を知りたい。どのようにdeconstructs私は複数のサブ文書を更新するのに役立つだろうか? – Sachin

答えて

0

MongoシェルのBulk APIとNode.jsドライバでは、各操作が追加されると、前の操作と同じ型の場合、その型の操作のバッチに追加されます。それ以外の場合は、新しいバッチを作成するために使用されます。 execute()が呼び出されると、これらのバッチは作成された順序で実行されます。

Bulk APIでは、1秒あたり約4000回の操作(更新された100,000件のレコードで、毎秒5000回の操作)が得られました。操作のクラスが同じであれば、大量の操作を行うことは非常に効果的です。

コードごとに、検索/更新/検索/更新のパターンがあります。これにより、すべてのパフォーマンスの向上が無効になります。経験則は、同じクラス操作だけを実行するために、Bulk APIのより魅力的なセマンティクスを使用することです。そうすれば、あなたは良いパフォーマンスが保証されます。

あなたの操作にはmethod1を使用することをお勧めします。

関連する問題