2016-05-26 2 views
5

Ich habe eine neueste mongodb 3.2 und es gibt eine Sammlung von vielen Elementen, die timeStamp haben.Wie Zeiger des aktuellen Dokuments zu aktualisieren in updateMany

A müssen Millisekunden Date-Objekt konvertieren und jetzt verwende ich diese Funktion:

db.myColl.find().forEach(function (doc) { 
    doc.date = new Date(doc.date); 
    db.myColl.save(doc); 
}) 

Es dauerte sehr lange Zeit 2 Millionen von Zeilen zu aktualisieren.

Ich versuche updateMany zu verwenden (es scheint sehr schnell), aber wie kann ich auf ein aktuelles Dokument zugreifen? Gibt es eine Möglichkeit, die obige Abfrage mit updateMany neu zu schreiben?

Vielen Dank.

+0

Sie müssen verhandeln Zeit von Client und Server speichern. [Dieser kann Ihnen helfen.] (Http://stackoverflow.com/questions/8342725/multiply-field-by-value-in-mongodb/8343147#8343147) –

Antwort

2

Sie können anderen Bulk-Update-APIs nutzen, wie die bulkWrite() Methode, die Sie erlaubt, einen Iterator zu verwenden, um ein Dokument zuzugreifen, manipulieren, fügen Sie das geänderte Dokument auf eine Liste und dann die Liste der Update-Operationen senden in ein Stapel an den Server zur Ausführung.

Im Folgenden demonstriert diesen Ansatz, in dem Sie die Cursor des forEach() Methode verwenden, würden die colloction und ändern Sie das jedes Dokument zur gleichen Zeit zu durchlaufen, um eine Charge von etwa 1000 Dokumenten, die die Update-Operation drängen, die dann aktualisiert werden können sofort unter Verwendung der bulkWrite() Methode.

Dies ist so effizient wie mit dem updateMany(), da sie die gleichen zugrunde liegenden bulk Schreiboperationen verwendet:

var cursor = db.myColl.find({"date": { "$exists": true, "$type": 1 }}), 
    bulkUpdateOps = []; 

cursor.forEach(function(doc){ 
    var newDate = new Date(doc.date); 
    bulkUpdateOps.push({ 
     "updateOne": { 
      "filter": { "_id": doc._id }, 
      "update": { "$set": { "date": newDate } } 
     } 
    }); 

    if (bulkUpdateOps.length == 1000) { 
     db.myColl.bulkWrite(bulkUpdateOps); 
     bulkUpdateOps = []; 
    } 
});   

if (bulkUpdateOps.length > 0) { db.myColl.bulkWrite(bulkUpdateOps); } 
1

Aktuelle Abfrage ist die einzige Lösung, um Feldwert von selbst oder anderen Feldwert (man könnte einige Daten mit mehr als einem Feld aus Dokument berechnen).

Es gibt eine Möglichkeit, die Leistung dieser Abfrage zu verbessern - wenn sie direkt auf dem Server in der mongo Shell ausgeführt wird (es werden keine Daten an den Client übergeben).

Verwandte Themen