2016-05-04 9 views
4

Ich versuche, zwei Dokumente in MongoDB mit zwei verschiedenen Werten zu aktualisieren. Ich habe es mit zwei verschiedenen Callbacks gemacht, aber ist es möglich, es mit nur einer Anfrage zu tun?Aktualisieren Sie viele Dokumente in MongoDB mit verschiedenen Werten

Meine Lösung:

mongo.financeCollection.update(
    { 'reference': 10 }, 
    { $push:  
     { history: history1 } 
    }, function (err){ 
     if (err){ 
      callback (err); 
     } 
     else { 
      mongo.financeCollection.update(
       { 'reference': 20 }, 
       { $push: 
        { history: history2 } 
       }, function (err){ 
        if (err){ 
         callback(err); 
        } 
        else { 
         callback(null); 
        }  
      }); 
     } 
    }); 

Sorry, wenn es eine dumme Frage, aber ich will nur meinen Code optimieren!

Antwort

3

Am besten dieses Update unter Verwendung der bulkWrite API. Betrachten Sie das folgende Beispiel für die beiden oben genannten Dokumente:

var bulkUpdateOps = [ 
    { 
     "updateOne": { 
      "filter": { "reference": 10 }, 
      "update": { "$push": { "history": history1 } } 
     } 
    }, 
    { 
     "updateOne": { 
      "filter": { "reference": 20 }, 
      "update": { "$push": { "history": history2 } } 
     } 
    } 
]; 

mongo.financeCollection.bulkWrite(bulkUpdateOps, 
    {"ordered": true, "w": 1}, function(err, result) { 
     // do something with result 
     callback(err); 
    } 

Die {"ordered": true, "w": 1} stellt sicher, dass die Dokumente in Reihe auf dem Server aktualisiert werden, in der Reihenfolge zur Verfügung gestellt und damit, wenn ein Fehler alle verbleibenden Updates abgebrochen werden auftritt. Die Option {"w": 1} legt die Schreibanforderungen fest, wobei 1 eine Anforderungsbestätigung ist, die die Schreiboperation an den Standalone-Mongod oder die Primärdatenbank in einem Replikatsatz weitergegeben hat.


Für MongoDB >= 2.6 und <= 3.0, verwenden Sie die Bulk Opeartions API wie folgt:

var bulkUpdateOps = mongo.financeCollection.initializeOrderedBulkOp(); 
bulkUpdateOps 
    .find({ "reference": 10 }) 
    .updateOne({ 
     "$push": { "history": history1 } 
    }); 
bulkUpdateOps 
    .find({ "reference": 20 }) 
    .updateOne({ 
     "$push": { "history": history2 } 
    }); 

bulk.execute(function(err, result){ 
    bulkUpdateOps = mongo.financeCollection.initializeOrderedBulkOp(); 
    // do something with result 
    callback(err); 
}); 
+0

Sie wirklich danken! aber uniformetely Objekt # hat keine Methode 'BulkWrite', ich benutze Mongo 3.0.11, ist es der Grund? – chou

+1

Ja, 'bulkWrite()' ist nur für MongoDB-Versionen '> = 3.2' verfügbar, ich habe meine Antwort mit einer Alternative für frühere Versionen aktualisiert. – chridam

Verwandte Themen