Error al actualizar una matriz en Mongo
Pregunta
He creado una matriz en mi documento Mongo, por lo que se ve un poco como lo siguiente:
{ "_id" : ObjectId("4f59e19d0b7aab2903000004"),
"details" : { x:1, y:2 }
}
Luego estoy tratando de presionar un nuevo valor a la matriz, haciendo:
db.users.update({"_id" : ObjectId("4f59e19d0b7aab2903000004")},{$push: {"details": {"z":3}}});
Sin embargo, obtengo el error:
Cannot apply $push/$pushAll modifier to non-array
Parece que la única forma en que realmente puedo agregar la información a la matriz, es usar la notación de puntos para agregarla, por ejemplo,
db.users.update({"_id" : ObjectId("4f59e19d0b7aab2903000004")},{"details.z": 3});
que parece funcionar, pero cuando tengo una matriz de unos 30 valores, parece un poco tedioso.
Solo para mayor claridad, estoy usando el marco de Lithium PHP, no solo ingresando a estos manualmente, por lo que podía hacer un ciclo a través de una matriz para preparar los 'detalles'.A cada llave, pero no creo que eso sea necesario.¿Hay algo que me esté perdiendo en cuanto a por qué no empujará valores a la matriz?
(Mi código de litio fue el siguiente :)
User::update(array('$push'=>array('details'=>array('z'=>3))), array('_id'=>$id))
gracias,
dan
Solución
"detalles" es un documento incrustado, no una matriz.Si fue una matriz, se vería así (anote el [] que indica una matriz):
{ "_id" : ObjectId("4f59f0531ae8f3b5f92246fe"),
"details" : [ { "x" : 1 }, { "y" : 2 } ] }
Si entonces realiza un PUSH $:
db.users.update({"_id" : ObjectId("4f59f0531ae8f3b5f92246fe")},
{$push : {"details": {"z":3}}})
obtienes el resultado esperado:
db.users.find({"_id" : ObjectId("4f59f0531ae8f3b5f92246fe")})
{ "_id" : ObjectId("4f59f0531ae8f3b5f92246fe"),
"details" : [ { "x" : 1 }, { "y" : 2 }, { "z" : 3 } ] }
Básicamente, está tratando de presionar a un documento, no una matriz.