2014-04-18 64 views
18

$addToSet operator僅當該值不在數組中時才向數組添加值。如果該值在數組中,則$addToSet不會修改該數組。

我想插入兩個不應該通過一個請求重複的值。這可能嗎?

我試圖將一個數組傳遞給$addToSet運算符,但它插入了一個數組,而不是該數組中的每個值。

$ 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 ] ] } 

回答

45

the docs for $addToSet

如果該值是數組,$addToSet追加整個陣列作爲 單個元件。要分別添加該值的每個元素,請使用 $addToSet$each修飾符。詳情請參閱修改器。

所以,你應該使用這樣的:

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

我將我自己的答案。 :-)太簡單了...... –

+0

@IonicăBizău無論如何。您知道如果您打算添加問答類型的回覆,您實際上可以在一個提交中同時做出問題和答案。這避免了像我們這樣的人提交答案,因爲你實際上同時做了兩個。我打賭重複某處 –

+0

當我問這個問題時,我不知道答案。但是在發佈之後,我記得有可能與此有關的「每個」運營商。 :-) –

3

沒錯。但是,你需要的$each修改在語句中加入:

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

而結果:

{ "a" : [ 1, 2, 3, 4 ] }