2016-12-15 23 views
0

ここでは、私の顧客のコレクション更新MongoDBの

{ 
    name: xyz, 
    . 
    . 
    . 
    timelines: [ 
     { 
      . 
      . 
      . 
      lastModified: Sat Dec 10 2016 00:00:00 GMT+0530 (IST) 
     }, 
     { 
      . 
      . 
      . 
      lastModified: Mon Dec 12 2016 00:00:00 GMT+0530 (IST) 
     } 
     . 
     . 
     . 
    ] 
    createdAt: Sun Nov 20 2016 00:00:00 GMT+0530 (IST) 
    lastModified: 'Missing' 
} 

だ私は、タイムラインの最新LASTMODIFIEDメインLASTMODIFIEDフィールドを更新します。この場合、月12月12日00:00:00 GMT + 0530(IST)

答えて

0

文書を集約し、タイムライン配列から最大の日付エントリを取得し、集計の結果リストをループするメカニズムが必要ですこの値を持つコレクション内の各ドキュメント を更新します。基本的な方法は次のとおりです。

db.customers.aggregate([ 
    { "$unwind": "$timelines" }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "latestDate": { "$max": "$timelines.lastModified" } 
     } 
    } 
]).forEach(function(doc){ 
    db.customers.updateOne(
     { "_id": doc._id, "lastModified": { "$lt": doc.latestDate } }, 
     { "$set": { "lastModified": doc.latestDate } } 
    ) 
}); 

かわりに、少し更新をこのように、文書ごとに更新要求を送信することで、バルクであなたのコレクションを更新することができますバルクAPIと、より効率的であるためにあなたの更新プログラムを活用することができますより速くより多くの演奏。次の例は、bulkWrite()メソッドでこれを実証しています。

var ops = []; 

db.customers.aggregate([ 
    { "$unwind": "$timelines" }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "latestDate": { "$max": "$timelines.lastModified" } 
     } 
    } 
]).forEach(function(doc){ 
    ops.push({ 
     "updateOne": { 
      "filter": { 
       "_id": doc._id, 
       "lastModified": { "$lt": doc.latestDate } 
      }, 
      "update": { 
       "$set": { "lastModified": doc.latestDate } 
      } 
     } 
    }); 

    // Send to server in batches of 500 operations only 
    if (ops.length % 500 === 0) { 
     db.customers.bulkWrite(ops); 
     ops = []; 
    } 
}) 

// Clear remaining queue 
if (ops.length > 0) 
    db.customers.bulkWrite(ops);