2011-07-19 15 views
18

पर अद्वितीय सूचकांक मैं एक संरचना इस के समान है:MongoDB: सरणी तत्व की संपत्ति

class Cat { 
    int id; 
    List<Kitten> kittens; 
} 

class Kitten { 
    int id; 
} 

मैं उपयोगकर्ताओं को एक ही आईडी के साथ एक से अधिक बिल्ली का बच्चा के साथ एक बिल्ली बनाने से रोकने के लिए करना चाहते हैं। मैं एक सूचकांक बनाने के रूप में इस की कोशिश की है:

db.Cats.ensureIndex({'id': 1, 'kittens.id': 1}, {unique:true}) 

लेकिन जब मैं एक बुरी तरह से स्वरूपित बिल्ली सम्मिलित करने के लिए प्रयास करते हैं, मोंगो यह स्वीकार करता है।

क्या मुझे कुछ याद आ रही है? क्या यह भी किया जा सकता है?

+1

http://stackoverflow.com/questions/4435637/mongodb-unique-key-in-embedded-document/4437836 – pingw33n

उत्तर

24

जहाँ तक मुझे पता है, अद्वितीय अनुक्रमणिका केवल अलग दस्तावेज़ों में विशिष्टता को लागू है, तो यह एक नकली चाबी त्रुटि फेंक होगा:

db.cats.insert({ id: 123, kittens: [ { id: 456 } ] }) 
db.cats.insert({ id: 123, kittens: [ { id: 456 } ] }) 

लेकिन यह अनुमति दी है:

db.cats.insert({ id: 123, kittens: [ { id: 456 }, { id: 456 } ] }) 

मैं सुनिश्चित नहीं है कि मोंगो स्तर पर आपको जिस बाधा की आवश्यकता है, उसे लागू करने का कोई तरीका है, हो सकता है कि जब आप अपडेट डालेंगे तो आप एप्लिकेशन लॉजिक में कुछ जांच सकते हैं?

+1

दुर्भाग्य से यह देखें ऐसा लगता है कि आप सही हैं - मुझे इसे कोड में लागू करना होगा। ओह अच्छा। –

+6

बहुत दुखी! :(। दस्तावेज़ सरणी में विशिष्टता सुनिश्चित करने के लिए एक विकल्प होना चाहिए। –

+0

आप यह सुनिश्चित करने के लिए सरणी में सहेजते समय सत्यापन सत्यापन हुक लिख सकते हैं कि यह अद्वितीय है –

21

एक सरणी क्षेत्र

ऊपर के उदाहरण के अलावा में व्यक्तिगत मूल्यों की विशिष्टता सुनिश्चित करना, वहाँ MongoDB में एक समारोह सुनिश्चित करने के लिए है कि जब आप एक सरणी के लिए एक नया वस्तु/मूल्य जोड़ रहे हैं फ़ील्ड, यह केवल तभी अपडेट करेगा जब मान/ऑब्जेक्ट पहले से मौजूद न हो।

तो तुम एक दस्तावेज है कि इस तरह दिखता है अगर:

{ _id: 123, kittens: [456] } 

यह अनुमति दी जाएगी:

db.cats.update({_id:123}, {$push: {kittens:456}}) 

{ _id: 123, kittens: [456, 456] } 

में जिसके परिणामस्वरूप हालांकि $ addToSet का उपयोग कर फ़ंक्शन ($ पु के विपरीत sh) यह जांच करेगा कि यह जोड़ने से पहले मान पहले से मौजूद है या नहीं। तो, के साथ शुरू:

{ _id: 123, kittens: [456] } 

तो क्रियान्वित:

db.cats.update({_id:123}, {$addToSet: {kittens:456}}) 

इसका कोई प्रभाव नहीं होगा।

तो, लंबी कहानी छोटी, अद्वितीय बाधाएं एक सरणी क्षेत्र के मूल्य वस्तुओं के भीतर विशिष्टता को मान्य नहीं करती हैं, केवल दो दस्तावेज़ों में अनुक्रमित फ़ील्ड में समान मान नहीं हो सकते हैं।

1

सरणी विशेषता में uniquness के साथ सम्मिलित करने के बराबर है। निम्नलिखित कमांड अनिवार्य रूप से सम्मिलित करता है जबकि बिल्ली के बच्चे की विशिष्टता सुनिश्चित करता है (अगर आपके साथ ऑब्जेक्ट पहले से मौजूद नहीं है तो अपरर्ट आपके लिए बनाता है)।

db.cats.update(
    { id: 123 }, 
    { $addToSet: {kittens: { $each: [ 456, 456] }}, $set: {'otherfields': 'extraval', "field2": "value2"}}, 
    { upsert: true} 
) 

वस्तु के परिणामस्वरूप मूल्य होगा

{ 
    "id": 123, 
    "kittens": [456], 
    "otherfields": "extraval", 
    "field2": "value2" 
} 
+0

महत्वपूर्ण गुण हैं: '$ addToSet' और 'upsert'। '$ सेट' संपत्ति ओपी से असंबंधित है। –

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