2014-04-18 17 views
18

$addToSet operatorchỉ thêm một giá trị vào một mảng nếu giá trị chưa có trong mảng. Nếu giá trị nằm trong mảng, $addToSet không sửa đổi mảng.

Tôi muốn chèn hai giá trị không được sao chép qua một yêu cầu. Điều này có thể không?

Tôi đã cố chuyển một mảng tới toán tử $addToSet nhưng nó đã chèn một mảng thay vì mỗi giá trị từ mảng đó.

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

Trả lời

45

Từ the docs for $addToSet:

Nếu giá trị là một mảng, $addToSet gắn thêm cả mảng như một yếu tố duy nhất . Để thêm từng phần tử của giá trị một cách riêng biệt, hãy sử dụng $addToSet với công cụ sửa đổi $each. Xem Modifiers để biết chi tiết.

Vì vậy, bạn nên sử dụng này để thay thế:

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

tôi đã thêm câu trả lời của riêng tôi. :-) Vì vậy, dễ dàng ... –

+0

@ IonicăBizău Dù sao đi nữa. Bạn biết nếu bạn có ý định thêm một loại trả lời Q & A, bạn thực sự có thể thực hiện cả câu hỏi và câu trả lời trong một bài nộp. Điều này tránh những kẻ như chúng tôi chỉ gửi câu trả lời vì bạn thực sự đã làm cả hai cùng một lúc. Tôi cá cược trên bản sao ở đâu đó mặc dù –

+0

Khi tôi hỏi câu hỏi tôi không biết câu trả lời. Nhưng sau khi đăng nó, tôi nhớ rằng có '$ mỗi' nhà điều hành có thể liên quan đến điều đó. :-) –

3

Yep. Nhưng bạn cần sửa đổi $each được thêm vào trong bản Tuyên Bố của bạn:

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

Và kết quả:

{ "a" : [ 1, 2, 3, 4 ] } 
Các vấn đề liên quan