2016-11-01 2 views
2

Я хочу обновить в полепо порядку все мои документы, чтобы они были 1..2..3..4 .... 34.mongodb обновить ключ ко всем документам, используя forEach

После запуска все они имеют «порядок»: «34». Что я делаю неправильно?

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

Возможный дубликат [Обновить поле с другим значением поля в документе] (http://stackoverflow.com/questions/2606657/update-field-with-another-fields-value-in-the-document) – styvane

ответ

2

multi : true означает, что все документы, соответствующие запросу будут обновлены. И ваш запрос: {}, который соответствует всем документам. Итак, в основном вы обновляете order всех документов на каждой итерации.

Кроме того, режим snapshot должен быть включен на курсоре, чтобы гарантировать, что один и тот же документ не возвращается более одного раза.

Вы можете попробовать это:

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

С точки зрения производительности, то лучше использовать объемные API. bulkwrite

+1

Спасибо 4J41, это сработало. Наверное, до сих пор я не был так уверен в том, как поможет {"_id": image._id}. Приветствия. –

+0

Это работает, но это то, что вы не хотите делать. – styvane

+0

Styvane вы можете объяснить, что вы имеете в виду? –