2012-03-09 13 views
12

वर्तमान में मेरी परियोजना के लिए मोंगोस और मोंगोडीबी का पीछा करते हुए, लेकिन एक सेगमेंट में आते हैं जहां एपीआई स्पष्ट नहीं है।मोंगोस में अद्वितीय सरणी मान

मेरे पास एक मॉडल है जिसमें कई कुंजी और दस्तावेज हैं, और उनमें से एक कुंजी ओएस watchList कहलाती है। यह आईडी की एक सरणी है जिसे उपयोगकर्ता देख रहा है, लेकिन मुझे यह सुनिश्चित करने की ज़रूरत है कि ये मान अद्वितीय रहें।

यहां कुछ नमूना कोड है:

var MyObject = new Mongoose.Schema({ 
    //.... 
    watching : {type: Array, required: false}, 
    //.... 
}); 

तो मेरे सवाल का मैं कैसे सुनिश्चित कर सकते है कि मूल्यों सरणी में धकेल दिया ही कभी एक स्टोर है, तो मान अनन्य बनाने, मैं सिर्फ unique: true उपयोग कर सकते हैं?

धन्यवाद

उत्तर

14

मेरे ज्ञान के लिए, मोंगोस में ऐसा करने का एकमात्र तरीका अंतर्निहित मोंगो ऑपरेटर (mentioned by danmactough) को कॉल करना है।

var idToUpdate, theIdToAdd; /* set elsewhere */ 
Model.update({ _id: idToUpdate }, 
      { $addToSet: { theModelsArray: theIdToAdd } }, 
      function(err) { /*...*/ } 
); 

नोट:: नेवला में, कि तरह लग रहे हैं, तो इस कार्यक्षमता की आवश्यकता है नेवला संस्करण> = 2.2.2

+3

* theIdToAdd * एक सरणी हो सकता है, जैसे '["आईडी 1", "आईडी 2"] '? – RobertPitt

+2

मुझे लगता है कि आप इसके लिए प्रत्येक $ का उपयोग कर सकते हैं। –

+2

@ रॉबर्टपिट उत्कृष्ट बिंदु ... IDToAdd एक सरणी नहीं हो सकता है। यदि आप ऐसा करते हैं, तो आइटम डालने वाला वह सरणी होगा। मैं इसे हल करने का कोई तरीका ढूंढने की कोशिश कर रहा हूं :-( – superiggy

6

Mongo documentation on the $addToSet operator पर एक नजर डालें।

+0

तो, $ addToSet सरणी में एक नया तत्व जोड़ देगा यदि इसमें पहले से ही डुप्लिकेट नहीं है। क्या कोई तरीका है (उदाहरण के लिए एक अद्वितीय अनुक्रमणिका बनाना), जो सुनिश्चित करेगा कि किसी सरणी में कभी डुप्लिकेट नहीं किया गया है? असल में, मैं अनुक्रम के बजाय एक सेट चाहता हूँ। –

1

नेवला MongoDB के लिए एक ऑब्जेक्ट मॉडल है, इसलिए एक ही विकल्प एक के रूप में दस्तावेज़ के इलाज के लिए है सामान्य जावास्क्रिप्ट ऑब्जेक्ट।

MyModel.exec(function (err, model) { 
    if(model.watching.indexOf(watchId) !== -1) model.watching.push(watchId); 

    model.save(...callback); 
}); 

हालांकि, मुझे लगता है कि नेवला सहमत इस collection document reference feature के लिए एक सत्यापनकर्ता के रूप में बनाया के लिए कुछ समर्थन करना चाहिए था करते हैं - विशेष रूप से, क्योंकि ज्यादातर समय आप केवल विशिष्ट संदर्भ जोड़ना चाहते हैं।

+2

जीता है यदि काम एक समवर्ती ऑपरेशन द्वारा मॉडल में जोड़ा गया था, तो काम नहीं करेगा, और आपके उदाहरण में, आप जांच करेंगे कि सेट मॉडल की एक पुरानी प्रतिलिपि में मौजूद है या नहीं। इसलिए एक लागू डेटाबेस स्तर अद्वितीय अनुक्रमणिका की आवश्यकता है। – ninja123

संबंधित मुद्दे