2012-04-12 15 views
30

Chciałbym dodać push na początku mojego zestawu, zamiast dodawać do końca, kiedy wykonuję mongo $ push.

Czy można przeprowadzić atomową aktualizację wypychania, która dodaje elementy jako pierwsze, a nie jako ostatnie?


2014 aktualizacja: yes you can.

+1

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

+2

możliwy duplikat [jak dodać wartość do początku tablicy w mongodb?] (Http://stackoverflow.com/questions/7936019/how-do -i-add-a-value-to-the-top-of-array-in-mongodb) –

Odpowiedz

20

Od MongoDB v2.5.3, pojawia się nowa $position operator, który można dołączyć wraz z operatorem $each jako część zapytania $push, aby określić lokalizację w tablicy, w której chcesz wstawić wartość.

Oto przykład ze strony docs, aby dodać elementy 20 i 30 na indeks tablicy 2 ::

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

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

+0

Rzeczywiście, będzie to miłe, gdy popchną wersję stabilną 2.6. – lostintranslation

+2

Składnia '$ push - $ each - $ position: 0' jest niezręczna. Pomóż [wprowadzić $ unshift, głosując na ten problem] (https://jira.mongodb.org/browse/SERVER-19974). –

+0

Działa również tylko w przypadku aktualizacji, prawda? Dodanie nowego elementu do tablicy nie będzie działać. – backdesk

5

Podobne pytanie zadano kilka dni temu. Niestety, krótka odpowiedź brzmi "nie", ale jest otwarta prośba o tę funkcję.
https://jira.mongodb.org/browse/SERVER-2191 - „$ push() do przodu tablicy”

Jest trochę więcej informacji, jak również możliwe obejście na innym wątku: „Wykorzystanie MongoDB tablica jako stos” - Use MongoDB array as stack

Mam nadzieję, że powyższe informacje będą przydatne i pomogą w znalezieniu możliwego do zaakceptowania obejścia.

+0

Aha. Wygląda na to, że Chris Shain pokonał mnie na pięści! Nie zauważyłem komentarza przed opublikowaniem. – Marc

+0

@Monkey: od wersji 2.5.3 można użyć składni '$ push - $ each - $ position: 0'. Czy możesz zaktualizować zaakceptowaną odpowiedź? Ponadto, ponieważ ta składnia jest niezręczna, pomóż [wprowadzić $ unshift, głosując na ten problem] (https://jira.mongodb.org/browse/SERVER-19974). –

25

Wykorzystanie ujemny wskaźnik z $ ustawiony prepend, testowane w 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

Świetne rozwiązanie! – ORL

+0

Czy istnieje sposób ustawiania wielu wartości na początku tablicy? – Modi

+0

Świetne obejście. Wygląda na to, że mongo 2.6 (stable) będzie zawierać non-work. – lostintranslation

Powiązane problemy