Самым простым способом выполнения такой операции является циклический просмотр набора данных с повторным отображением имени поля.Самый простой способ сделать это - написать функцию, которая выполняет перезапись, а затем использовать синтаксис .find().forEach()
в оболочке.
Вот пример из оболочки:
db.foo.save({ a : 1, b : 2, c : 3});
db.foo.save({ a : 4, b : 5, c : 6});
db.foo.save({ a : 7, b : 8 });
db.foo.find();
remap = function (x) {
if (x.c){
db.foo.update({_id:x._id}, {$set:{d:x.c}, $unset:{c:1}});
}
}
db.foo.find().forEach(remap);
db.foo.find();
В приведенном выше случае я делаю $unset
и $set
в одном действии.MongoDB не поддерживает транзакции между коллекциями, но приведенный выше документ представляет собой один документ.Таким образом, вы гарантированно, что set и unset будут атомарными ( т.е. они оба преуспеют или оба не справятся ).
Единственное ограничение здесь - то, что вам нужно будет управлять внешними авторамисохранить данные согласованными.Обычно я предпочитаю отключать запись во время обновления.Если этот параметр недоступен, вам придется выяснить, какой уровень согласованности вы хотите для данных.(Я могу привести некоторые идеи здесь, но это действительно будет зависеть от ваших данных и системы)