2014-04-18 16 views
18

$addToSet operatordodaje wartość do tablicy tylko wtedy, gdy wartość nie znajduje się jeszcze w tablicy. Jeśli wartość znajduje się w tablicy, $addToSet nie modyfikuje tablicy.

Chcę wstawić dwie wartości, które nie powinny być duplikowane przez jedno żądanie. czy to możliwe?

Próbowałem przekazać tablicę do operatora $addToSet, ale wstawiono tablicę zamiast każdej wartości z tej tablicy.

$ mongo test 
MongoDB shell version: 2.4.9 
connecting to: test 
> db.c.insert({a: [1, 2, 3]}) 
> db.c.find() 
{ "_id" : ObjectId("53511a255a82cd559393d840"), "a" : [ 1, 2, 3 ] } 
> db.c.update({}, {$addToSet: {a: [2, 4]}}) 
> db.c.find() 
{ "_id" : ObjectId("53511a255a82cd559393d840"), "a" : [ 1, 2, 3, [ 2, 4 ] ] } 

Odpowiedz

45

Z the docs for $addToSet:

Jeśli wartość jest tablicą $addToSet dodaje się cały szereg postaci jeden element. Aby dodać każdy element wartości osobno, użyj $addToSet z modyfikatorem $each. Aby uzyskać szczegółowe informacje, zobacz modyfikatory.

Więc należy użyć zamiast tego:

db.c.update({}, {$addToSet: {a: {$each: [2, 4]}}}) 
+0

byłem dodając własną odpowiedź. :-) Tak łatwo ... –

+0

@ IonicăBizău Cokolwiek. Wiesz, że jeśli chcesz dodać odpowiedź typu pytania i odpowiedzi, w jednym zgłoszeniu możesz wykonać zarówno pytanie, jak i odpowiedź. Dzięki temu faceci, tacy jak my, po prostu przesyłają odpowiedzi, ponieważ robili to w tym samym czasie. Stawiam na duplikat gdzieś chociaż –

+0

Kiedy zadałem pytanie, nie znałem odpowiedzi. Ale po opublikowaniu przypomniałem sobie, że istnieje operator '$ each', który może być z tym powiązany. :-) –

3

Yep. Ale trzeba modyfikator $each należy dodać w swoim oświadczeniu:

db.c.update({},{ $addToSet: { a: {$each: [ 2, 4 ] } } }) 

a wynik:

{ "a" : [ 1, 2, 3, 4 ] } 
Powiązane problemy