2012-07-07 9 views
40

Estoy tratando de actualizar un solo subelemento contenido dentro de una matriz en un documento mongodb. Quiero hacer referencia al campo usando su índice de matriz (los elementos dentro de la matriz no tienen ningún campo que pueda garantizar serán identificadores únicos). Parece que esto debería ser fácil de hacer, pero no puedo entender la sintaxis.MongoDB: ¿Cómo actualizo un único subelemento en una matriz, referenciada por el índice dentro de la matriz?

Esto es lo que quiero hacer en pseudo-json.

Antes:

{ 
    _id : ..., 
    other_stuff ... , 
    my_array : [ 
    { ... old content A ... }, 
    { ... old content B ... }, 
    { ... old content C ... } 
    ] 
} 

Después:

{ 
    _id : ..., 
    other_stuff ... , 
    my_array : [ 
    { ... old content A ... }, 
    { ... NEW content B ... }, 
    { ... old content C ... } 
    ] 
} 

parece que la consulta debe ser algo como esto:

//pseudocode 
db.my_collection.update(
    {_id: ObjectId(document_id), my_array.1 : 1 }, 
    {my_array.$.content: NEW content B } 
) 

Pero esto no funciona. He pasado demasiado tiempo buscando en los documentos de mongodb y probando diferentes variaciones en esta sintaxis (por ejemplo, usando $slice, etc.). No puedo encontrar ninguna explicación clara de cómo lograr este tipo de actualización en MongoDB.

Respuesta

51

Como era de esperar, la consulta es fácil una vez que sepa cómo hacerlo. Aquí está la sintaxis, en python:

db["my_collection"].update(
    { "_id": ObjectId(document_id) }, 
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}} 
) 
+9

No .. .. era realmente desconocido – Moumit

10

En estilo mongo, usando el operador posicional '$'. Echa un vistazo a este link para más detalles.

db.my_collection.update(
    {_id: ObjectId(document_id), my_array.1 : 1 }, 
    { $set: { "my_array.$.content" : "NEW content B" } } 
) 
19

actualización de un elemento de matriz referenciado por un índice (por ejemplo, 1) en Mongo Shell también puede hacerse mediante la indicación directamente el valor del índice:

db.my_collection.update(
    {_id : "document_id"}, 
    {$set : {"my_array.1.content" : "New content B"}} 
) 
0
db.my_collection.update(
    {_id: ObjectId(document_id), my_array : { ... old content A ... } }, 
    { $set: { "my_array.$.content" : "NEW content B" } } 
) 
Cuestiones relacionadas