2012-04-12 21 views
30

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

¿Es posible hacer una actualización de inserción atómica que agregue elementos como la primera en vez de la última?


actualización: yes you can.

+1

Ver http://stackoverflow.com/questions/ 10094573/use-mongodb-array-as-stack # comment12929388_10094573 –

+2

posible duplicado de [¿cómo agrego un valor a la parte superior de una matriz en mongodb?] (Http://stackoverflow.com/questions/7936019/how-do -i-add-a-value-to-the-top-of-an-array-in-mongodb) –

Respuesta

20

A partir de MongoDB V2.5.3, hay una nueva $position operador que se pueden incluir junto con el operador como $each parte de su consulta $push para especificar la ubicación en la matriz en la que desea insertar un valor.

Aquí está un ejemplo de la página docs 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

+0

De hecho, esto será bueno una vez que empujen la versión estable 2.6. – lostintranslation

+2

La sintaxis '$ push - $ each - $ position: 0' es incómoda. Por favor ayude [implemente $ unshift votando sobre este tema] (https://jira.mongodb.org/browse/SERVER-19974). –

+0

También solo funciona para la actualización, ¿verdad? Agregar un NUEVO elemento en la matriz no funcionará. – backdesk

5

Hace unos días se hizo una pregunta similar. 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: "matriz Uso MongoDB como pila" - Use MongoDB array as stack

suerte lo anterior será útil y lo ayudará a encontrar una solución aceptable.

+0

Aha. ¡Parece que Chris Shain me ganó al golpe! No vi el comentario antes de publicar. – Marc

+0

@Monkey: desde v2.5.3, puede usar la sintaxis '$ push - $ each - $ position: 0'. ¿Puedes actualizar la respuesta aceptada? Además, como esa sintaxis es incómoda, por favor ayude [implemente $ unshift votando sobre este tema] (https://jira.mongodb.org/browse/SERVER-19974). –

25

Uso índice negativo de $ fijó para anteponer, probada 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 ] } 
+1

¡Gran solución! – ORL

+0

¿Hay alguna manera de establecer valores múltiples al comienzo de la matriz? – Modi

+0

Gran solución. Parece que mongo 2.6 (estable) incluirá un no-trabajo alrededor. – lostintranslation