2011-01-27 3 views

ответ

29

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

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

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

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

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

+6

Вопрос явно задает вопрос о том, как выполнить это без $ rename ... – samkass

+14

Здесь есть синтаксическая ошибка - последний '}' неуместен. Вы хотите запустить 'db.collection_name.update ({}, {$ rename: {" oldname ":" newname "}}, false, true);'. – girasquid

+0

-1 это не работает в Mongo 1.6.5 – opyate

Смежные вопросы