Как переименовать вложенный ключ в mongodb - PullRequest
2 голосов
/ 19 августа 2011

Я хочу переименовать, чтобы переименовать мой ключ dict в mongodb.

обычно это работает так db.update({'_id':id},{$rename:{'oldfieldname':newfieldname}})

Моя структура документа выглядит так

{
    'data':'.....',
    'field':{'1':{'data':....},'2':{'data'...}},
    'more_data':'....',
}

если я хочу установить новое поле в поле 1 я делаю db.update({'_id':id},{$set:{'field.0.1.name':'peter'}})

для поля два это 'field'.1.2.name'

я подумал, что с переименованием должно быть похоже, но это не так ...

Ответы [ 2 ]

5 голосов
/ 16 декабря 2011

Вот гибкий метод переименования ключей в базе данных.

Учитывая структуру документа, подобную этой ...

{
   "_id": ObjectId("4ee5e9079b14f74ef14ddd2f"),
   "code": "130.4",
   "description": "4'' Socket Plug",
   "technicalData": {
       "Drawing No": "50",
       "length": "200mm",
       "diameter: "20mm"
   },
}

Я хочу перебрать все документы и переименовать technicalData ["DrawingNo "] to technicalData [" номер чертежа "]

Запустите следующий javascript на панели исполнения в (отлично) RockMongo

function remap(x){
    dNo = x.technicalData["Drawing No"];
    db.products.update({"_id":x._id}, {
       $set: {"technicalData.Drawing Number" : dNo},  
       $unset: {"technicalData.Drawing No":1} 
    });
}

db.products.find({"technicalData.Drawing No":{$ne:null}}).forEach(remap);

Код также будетзапустить в оболочке монго

1 голос
/ 19 августа 2011

Ваш вопрос неясен, но, кажется, вы хотите переименовать имя поля в массиве.

Короткий ответ: вы не можете.Как указано в документах , $ rename не расширяет массивы, чтобы найти подходящее имя.Работает только на полях верхнего уровня.

Для имитации переименования вы можете скопировать поле и его данные под новым именем, а затем удалить исходное поле.Вам также может понадобиться способ учета потенциально одновременных записей, если у вас много записей в этот объект / поле.

...