Ответ 1
Простейшим способом выполнения такой операции является циклическое переполнение набора данных, переназначающее имя поля. Самый простой способ сделать это - написать функцию, которая выполняет повторную запись, а затем использовать синтаксис .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 не поддерживает транзакции между коллекциями, но выше это один документ. Таким образом, вам гарантировано, что набор и unset будут атомарными (т.е. Они оба успешны или оба они не работают).
Единственное ограничение здесь заключается в том, что вам нужно будет управлять внешними писателями, чтобы данные были согласованы. Мое обычное предпочтение для этого - просто отключить записи во время обновления. Если этот параметр недоступен, вам нужно выяснить, какой уровень согласованности вы хотите для данных. (Я могу дать некоторые идеи здесь, но это действительно будет специфично для ваших данных и системы)