Как обновить определенный элемент массива в MongoDB

Я новичок в MongoDB. Я сохранил данные внутри mongoDB в формате ниже

"_id" : ObjectId("51d5725c7be2c20819ac8a22"),
"chrom" : "chr22",
"pos" : 17060409,
"information" : [

        {
                "name" : "Category",
                "value" : "3"
        },
        {
                "name" : "INDEL",
                "value" : "INDEL"
        },
        {
                "name" : "DP",
                "value" : "31"
        },
        {
                "name" : "FORMAT",
                "value" : "GT:PL:GQ"
        },

        {
                "name" : "PV4",
                "value" : "1,0.21,0.00096,1"
        }
],
"sampleID" : "Job1373964150558382243283"

Я хочу обновить значение до 11, которое имеет имя Category. Я пробовал ниже запрос:

db.VariantEntries.update({$and:[ { "pos" : 117199533} , { "sampleID" : "Job1373964150558382243283"},{"information.name":"Category"}]},{$set:{'information.value':'11'}})

но монго отвечает

can't append to array using string field name [value]

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


person Sach    schedule 16.07.2013    source источник
comment
Вы смотрели stackoverflow.com/questions/13040344/   -  person Slater Victoroff    schedule 16.07.2013


Ответы (2)


Вы можете использовать позиционный оператор $ для идентификации первого массива. элемент для соответствия запросу в обновлении следующим образом:

db.VariantEntries.update({
    "pos": 17060409,
    "sampleID": "Job1373964150558382243283", 
    "information.name":"Category"
},{
    $set:{'information.$.value':'11'}
})
person JohnnyHK    schedule 16.07.2013

В MongoDB вы не можете обращаться к значениям массива таким образом. Таким образом, вы должны изменить свой дизайн схемы на:

"information" : {
    'category' : 3,
    'INDEL' : INDEL
    ...
}

Затем вы можете обратиться к отдельным полям в своем запросе:

db.VariantEntries.update(
 {
    {"pos" : 117199533} , 
    {"sampleID" : "Job1373964150558382243283"},       
    {"information.category":3}
 },
 {
   $set:{'information.category':'11'}
 }
)
person Marko    schedule 16.07.2013