Actualizar campo en el array de elementos exactos en MongoDB


Tengo un documento estructurado así:

{
    _id:"43434",
    heroes : [
        { nickname : "test",  items : ["", "", ""] },
        { nickname : "test2", items : ["", "", ""] },
    ]
}

Puedo $set el segundo elemento de la matriz items del objeto incrustado en la matriz heros con nickname "test" ?

Resultado:

{
    _id:"43434",
    heroes : [
        { nickname : "test",  items : ["", "new_value", ""] }, // modified here
        { nickname : "test2", items : ["", "", ""] },
    ]
}
Author: Community, 2012-05-03

1 answers

Necesita hacer uso de 2 conceptos: el operador posicional de mongodb y simplemente usar el índice numérico para la entrada que desea actualizar.

El operador posicional le permite usar una condición como esta:

{"heros.nickname": "test"}

Y luego haga referencia a la entrada de matriz encontrada de la siguiente manera:

{"heros.$  // <- the dollar represents the first matching array key index

Como desea actualizar la 2a entrada de matriz en "elementos", y las claves de matriz son 0 indexadas, esa es la clave 1.

Así que:

> db.denis.insert({_id:"43434", heros : [{ nickname : "test",  items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]});
> db.denis.update(
    {"heros.nickname": "test"}, 
    {$set: {
        "heros.$.items.1": "new_value"
    }}
)
> db.denis.find()
{
    "_id" : "43434", 
    "heros" : [
        {"nickname" : "test", "items" : ["", "new_value", "" ]},
        {"nickname" : "test2", "items" : ["", "", "" ]}
    ]
}
 119
Author: AD7six,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-18 13:08:56