2014-04-18 9 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 संशोधक के साथ का उपयोग करें। विवरण के लिए Modifiers देखें।

तो आप इस के बजाय का उपयोग करना चाहिए:

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 ] } 
संबंधित मुद्दे