2012-05-03 17 views
51

Tengo un documento estructurado así:campo Actualizar en el conjunto de elementos exacta en MongoDB

{ 
    _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 : ["", "", ""] }, 
    ] 
} 

Respuesta

102

que necesita para hacer uso de 2 conceptos: mongodb's positional operator y simplemente utilizando el índice numérico para la entrada que desea actualizar.

El operador posicional permite el uso de una condición como esta:

{"heros.nickname": "test"} 

y luego hacer referencia a la entrada de la matriz se encuentra de este modo:

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

Como desea actualizar la segunda entrada de la matriz de "elementos", y claves de matriz están indexados 0 - esa es la clave 1.

Así:

> 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" : ["", "", "" ]} 
    ] 
} 
+0

Descripción simple y clara. Saludos –

+0

Gracias, ¡¡¡Has ganado mi vida !!! – juanmiguelRua

+0

¿cómo puedo acceder a un valor del elemento coincidente? como {"heros. $. items.2": "heros. $. nickname"}? – kommradHomer

Cuestiones relacionadas