MongoDB 1.6.5: как переименовать поле в коллекции

$функция переименования доступна только в версии 1.7.2 разработки. Как переименовать поле в 1.6.5?

Ответы

Ответ 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 будут атомарными (т.е. Они оба успешны или оба они не работают).

Единственное ограничение здесь заключается в том, что вам нужно будет управлять внешними писателями, чтобы данные были согласованы. Мое обычное предпочтение для этого - просто отключить записи во время обновления. Если этот параметр недоступен, вам нужно выяснить, какой уровень согласованности вы хотите для данных. (Я могу дать некоторые идеи здесь, но это действительно будет специфично для ваших данных и системы)

Ответ 2

db.collection_name.update({}, {$rename: {"oldname": "newname"}}, false, true);

Это переименует столбец для каждой строки в коллекции.

Кроме того, я обнаружил, что если ваш столбец (тот, который вы переименовываете), появится в каталоге индексов (db.collection_name.getIndexes()), тогда вам придется отбрасывать и воссоздавать индекс (используя имя нового столбца).