2016-09-26 5 views
0

У меня есть база данных MongoDB со многими документами в коллекции. Каждая из этих статей имеет поле под названием myField, содержащее строку.MongoDB: обновить поле строки во всех документах

Возможно ли для меня, чтобы запустить массовое обновление на всех документов в коллекции, изменяя значение myField для каждого документа?

В моем случае я просто хочу отключить конечный «.html» из каждого поля. Я использую node.js для взаимодействия с Mongo в моем приложении, но я предпочел бы иметь возможность запускать одну команду в командной строке mongo, чтобы сделать это обновление, если это возможно.

ответ

1

Yest можно обновить mongoDB информация о документе из командной строки с использованием mongo.

скажите имя файла сценария migration.js и зайдите в этот каталог и откройте командную строку и запустите эту команду.

mongo localhost/dbName migration.js 

и migration.js код, как:

print('Please wait it may will take some time to complete migration'); 
print('....'); 

db.collectionName.find().forEach(function(doc) { 

    if(!doc._id) { 
     print('No doc found'); 
     return; 
    } 
    // if need can apply logic to update myField 

    db.collectionName.update({_id: doc._id}, {$set: {myField: "newVale"}}); 
}); 

print('Migration has been completed :)'); 
+0

Awesome, спасибо! – TW80000

+0

Рад это услышать, и вы приветствуете :) –

1

Рассмотрите возможность использования bulkWrite API использовать обновление, как он справляется с этим гораздо лучше и эффективнее, чем делать обновление в цикле т.е. отправки каждое обновления запрос с каждой итерацией может быть медленным с большими наборами данных.

bulkWrite API отправляет запись на сервер в партиях сказать 500, который дает лучшую производительность, как вы не посылать каждый запрос на сервер, только один раз в каждые 500 запросов.

Для массовых операций MongoDB налагает default internal limit of 1000 операций на каждую партию, и поэтому выбор из 500 документов будет хорошим в том смысле, что у вас есть некоторый контроль над размером партии, а не для MongoDB, налагающего значение по умолчанию, то есть для более крупных операций в величина> 1000 документов.

Рассмотрим следующий пример:

var bulkUpdateOps = [], // create an array to hold the update operations 
    counter = 0, // counter to control the batch sizes 
    rgx = /\.(html)$/i, // regex for querying and updating the field 
    cursor = db.collection.find({ "myField": rgx }); // cursor for iterating 

cursor.snapshot().forEach(function(doc) { 
    var updatedField = doc.myField.replace(rgx, ''); // update field 
    bulkUpdateOps.push({ // queue the update operations to an array 
     "updateOne": { 
      "filter": { 
       "_id": doc._id, 
       "myField": { "$ne": updatedField } 
      }, 
      "update": { "$set": { "myField": updatedField } } 
     } 
    }); 
    counter++; 

    if (counter % 500 == 0) { // send the update ops in bulk 
     db.collection.bulkWrite(bulkUpdateOps); 
     bulkUpdateOps = []; // reset the array 
    } 
}) 

if (counter % 500 != 0) { // clean up remaining operations in the queue 
    db.collection.bulkWrite(bulkUpdateOps) 
} 
Смежные вопросы