2011-05-31 1 views
8

Используя оболочку mongodb, я пытаюсь добавить новое свойство к каждому документу в большой коллекции. Коллекция (листинг) имеет существующее свойство Address. Я просто пытаюсь добавить новое свойство LowerCaseAddress, которое можно использовать для поиска, так что мне не нужно использовать зависящее от регистра регулярное выражение для согласования адресов, что происходит медленно.Добавление нового свойства в каждый документ в большой коллекции

Вот сценарий, я пытался использовать в оболочке:

for(var c = db.Listing.find(); c.hasNext();) { 
    var listing = c.next(); 
    db.Listing.update({ LowerCaseAddress: listing.Address.toLowerCase() }); 
} 

Он побежал за ~ 6 часов, а затем мой компьютер разбился. Есть ли лучший способ добавить новое свойство к каждому документу в большую коллекцию (~ 4 миллиона записей)?

+0

Похоже, вам не хватает некоторых параметров на обновление - вы не имеете критерии, так что, возможно, пытается обновить каждый запись на каждой итерации цикла. (Я на самом деле не уверен, как работает mongo, если вы не устанавливаете критерии для обновления) –

+0

javascript здесь не работает. Взгляните на ответ Сид Берна. Кроме того, если вам нужно обновлять множество и много документов, вы, вероятно, захотите сделать это в пакетах, чтобы избежать блокировки и иметь контрольную точку для прогресса, если что-то не получится. –

ответ

17

у вас JavaScript не работает, но код ниже работает. Но не знаю, сколько времени потребуется для 4 миллионов записей.

db.Listing.find().forEach(function(item){ 
    db.Listing.update({_id: item._id}, {$set: { LowerCaseAddress: item.Address.toLowerCase() }}) 
}) 
+0

Этот запрос занял некоторое время, но он сработал, спасибо! – Justin

1

Вы можете использовать updateMany для этого тоже:

try { db.<collection>.updateMany({}, {$set: { LowerCaseAddress: item.Address.toLowerCase() } }); } catch(e) { print(e); }