2016-11-01 3 views
2

Ich möchte in Mongo das Feld "Reihenfolge" auf alle meine Dokumente aktualisieren, so dass sie 1..2..3..4 .... 34 sein werden.mongodb update einen Schlüssel für alle Dokumente mit forEach

Nach dem Ausführen haben sie alle "Reihenfolge": "34". Was mache ich falsch?

var i = 1; 
db.images.find().forEach(function() { 
db.images.update(
     {}, 
     { "$set": {"order": NumberInt(i)} }, 
     { multi: true } 
    ); 
    i++; 
}) 
+0

Mögliches Duplikat von [Feld mit dem Wert eines anderen Felds im Dokument aktualisieren] (http://stackoverflow.com/questions/2606657/update-field-with-another-fields-value-in-the-document) – styvane

Antwort

2

multi : true bedeutet, dass alle Dokumente, die die Abfrage aktualisiert wird übereinstimmen. Und Ihre Abfrage ist {}, die alle Dokumente übereinstimmt. Also im Grunde aktualisieren Sie die order aller Dokumente in jeder Iteration.

Außerdem muss snapshot Modus am Cursor aktiviert werden, um sicherzustellen, dass das gleiche Dokument nicht mehr als einmal zurückgegeben wird.

Sie können diese versuchen:

var i = 1; 
db.images.find().snapshot().forEach(function(image) { 
    db.images.update(
     {"_id" : image._id}, 
     { "$set": {"order": NumberInt(i)} } 
    ); 
    i++; 
}) 

Aus anwendungstechnischer Sicht ist es besser, den Bulk-APIs zu verwenden. bulkwrite

+1

Danke 4J41, das hat funktioniert. Ich glaube, ich war mir bisher nicht so sicher, wie {"_id": image._id} helfen würde. Prost. –

+0

Es funktioniert, aber es ist etwas, was Sie nicht tun möchten. – styvane

+0

Styvane können Sie erklären, worauf Sie sich beziehen? –

Verwandte Themen