MongoDB 1.6.5: как переименовать поле в коллекции - PullRequest
17 голосов
/ 27 января 2011

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

Ответы [ 2 ]

29 голосов
/ 27 января 2011

Самым простым способом выполнения такой операции является циклический просмотр набора данных с повторным отображением имени поля.Самый простой способ сделать это - написать функцию, которая выполняет перезапись, а затем использовать синтаксис .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 будут атомарными ( т.е. они оба преуспеют или оба не справятся ).

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

16 голосов
/ 10 января 2012
db.collection_name.update({}, {$rename: {"oldname": "newname"}}, false, true);

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...