query objects fields elemmatch array arrays mongodb

arrays - objects - ¿Puede tener mongo $ push prepend en lugar de añadir?



mongoose find in array of objects (3)

Una pregunta similar se hizo hace unos días. Lamentablemente, la respuesta breve es "no", pero hay una solicitud abierta para esta función.
https://jira.mongodb.org/browse/SERVER-2191 - "$ push () al frente de la matriz"

Hay algo más de información así como una posible solución alternativa en el otro hilo: "Usar la matriz de MongoDB como pila" - Usar la matriz de MongoDB como pila

Esperemos que lo anterior sea útil y lo ayude a encontrar una solución aceptable.

Me gustaría tener push add al principio de mi set en lugar de añadirlo al final cuando hago un mongo $ push.

¿Es posible realizar una actualización de inserción atómica que agregue elementos como los primeros en lugar de los últimos?

Actualización de 2014 : sí, puedes .


Use un índice negativo con $ set para prepend, probado en mongo v2.2:

> db.test.insert({''array'': [4, 5, 6]}) > db.test.find() { "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), "array" : [ 4, 5, 6 ] } //prepend 3 > db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, {''$set'': {''array.-1'': 3}}) > db.test.find() { "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), "array" : [ 3, 4, 5, 6 ] } //prepend 2 > db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, {''$set'': {''array.-1'': 2}}) > db.test.find() { "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), "array" : [ 2, 3, 4, 5, 6 ] } //prepend 1 > db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, {''$set'': {''array.-1'': 1}}) > db.test.find() { "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), "array" : [ 1, 2, 3, 4, 5, 6 ] }


A partir de MongoDB v2.5.3, hay un nuevo operador de $position que puede incluir junto con $each operador de $each como parte de su consulta de $push para especificar la ubicación en la matriz en la que desea insertar un valor.

Aquí hay un ejemplo de la página de documentos para agregar los elementos 20 y 30 en el índice de matriz de 2:

db.students.update( { _id: 1 }, { $push: { scores: { $each: [ 20, 30 ], $position: 2 } } } )

Referencia: http://docs.mongodb.org/master/reference/operator/update/position/#up._S_position