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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top