2014-11-19 2 views
0

Я недавно сменил одно из своих полей с object на array of objects.Переопределить существующие документы на производстве MongoDB

В моем производстве у меня есть только 14 документов с этим полем, поэтому я решил изменить эти поля.

Есть ли какие-либо рекомендации для этого?

Как и в моем производстве, мне нужно сделать это наилучшим образом?

Я получил документ идентификаторов того collections.like ['xxx','yyy','zzz',...........]

моей структура документа, как

_id:"xxx",option1:{"op1":"value1","op2":"value2"},option2:"some value" 

, и я хочу, чтобы изменить его, как (преобразование объекта в массив объектов)

_id:"xxx",option1:[{"op1":"value1","op2":"value2"}, 
        {"op1":"value1","op2":"value2"} 
       ],option2:"some value" 

Могу ли я использовать upsert? Если да, то как это сделать?

ответ

0

Так как вам нужно, чтобы создать новое значение поля на основе старого значения, вы должны получить каждый документ с запросом, как

db.collection.find({ "_id" : { "in" : [<array of _id's>] } }) 

затем итерация по результатам и $set значения поля для его новое значение:

db.collection.find({ "_id" : { "in" : [<array of _id's>] } }).forEach(function(doc) { 
    oldVal = doc.option1 
    newVal = compute_newVal_from_oldVal(oldVal) 
    db.collection.update({ "_id" : doc._id }, { "$set" : { "option" : newVal } }) 
}) 

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

0

Поскольку встроенный тип документа вы можете использовать толчок запрос

db.collectionname.update({_id:"xxx"},{$push:{option1:{"op1":"value1","op2":"value2"}}}) 

Это позволит создать документ внутри встроенный document.Hope помогает