2012-02-08 7 views
9

¿Existe alguna manera fácil de reemplazar un documento incrustado completo en una matriz? Say sustitución:Reemplazo de documentos incrustados en matriz en MongoDB

{ 
    "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
} 

con:

{ 
    "_id" : "2", 
     "name" : "name6", 
     "xyz..." : "xyz5..." 
     "morefields..." : "fields..." 
} 

Buscando _id (incrustado). ¿O necesito reemplazar cada campo individualmente usando $ set?

{ 
    "_id" : "2", 
    "users" : [{ 
     "_id" : "1", 
     "name" : "name1", 
     "xyz..." : "xyz1..." 
    }, { 
     "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
    }], 
    "name" : "main name" 
} 

Respuesta

18

Está utilizando el patrón "array of objects". Se puede utilizar el positional operator, debe ser algo como esto:

coll.update({'_id':'2', 'users._id':'2'}, {$set:{'users.$':{ "_id":2,"name":"name6",... }}}, false, true) 

En mi experiencia, la "matriz de objetos" patrón no es óptima si los objetos tienen una identificación natural. En su caso, esto podría ser modelado como la siguiente:

{ 
    "_id" : "2", 
    "users" : 
    { "1" : { "name" : "name1", "xyz..." : "xyz1..." }, 
     "2" : { "name" : "name2", "xyz..." : "xyz2..." } 
    } 
    "name" : "main name" 
} 

En este caso se puede utilizar el dot notation para actualizar fácilmente el elemento que desee.

var newValue = { "name" : "name6", "xyz..." : "xyz5...", "morefields..." : "fields..." }; 
coll.update({_id: 2}, { $set: { "users.2" : newValue } }); 
+0

Eso funciona genial, gracias! Es interesante la segunda alternativa, pero no estoy seguro de que funcione, ya que tendré que eliminar algunas entradas en el medio. "users.2" es la posición en la matriz que asumo. –

+0

Pensé que los usuarios.2 se referían a la posición de la matriz pero en realidad usa la identificación (y devuelven los corchetes vacíos para todos los demás elementos de la matriz}, genial. –

+0

MongoDB reconoce las matrices en una consulta. Así 'users.2' podría buscar a través de' matriz de usuarios buscando objetos con 'clave' de' 2' * o * podría mirar la 'clave: 2' de' usuarios'. –

Cuestiones relacionadas