2012-09-09 11 views
6

बनाम कहते हैं कि मैं एक और बाद में क्वेरी (Node.js वातावरण में नेवला ODM साथ MongoDB में) प्रति उपयोगकर्ता आइटमों की सूची बनाए रखने के लिए अगर एक आइटम एक उपयोगकर्ता के स्वामित्व में है देखना चाहते हैं देता है। उदाहरण के लिए, मैं प्रत्येक उपयोगकर्ता के सभी पसंदीदा रंगों को स्टोर करना चाहता हूं, और बाद में देख सकता हूं कि विशिष्ट रंग का एक विशिष्ट उपयोगकर्ता स्वामित्व में है या नहीं। ऐसा लगता है कि उपयोगकर्ता दस्तावेज़ के भीतर एक सरणी के बजाय, रंग दस्तावेज़ को एम्बेडेड ऑब्जेक्ट के रूप में स्टोर करना बेहतर होगा। कारण है कि है कि यह एक रंग एक वस्तु में मौजूद रहने पर देखने के लिए जाँच करने के लिए और अधिक कुशल लगता है के रूप में मैं सिर्फ अगर वस्तु संपत्ति मौजूद है देखने के लिए जाँच कर सकते हैं:MongoDB सरणियों वस्तुओं

if(user.colors.yellow){ 
    //true case 
} else { 
    //false case 
} 

एक सरणी बनाम जहाँ मैं के माध्यम से पुनरावृति करने के लिए है

for (var i = 0; i < user.colors.length; i++) { 
    if(user.colors[i] === "yellow"){ 
    //true case 
    } else { 
    //false case 
    } 
} 

हालांकि, उदाहरण मैं ऑनलाइन देखा है में से कई से, यह बात इस प्रकार के सरणियों का उपयोग कर की तरह लगता है काफी प्रचलित है: पूरे सरणी रंग कहीं मौजूद है यदि सरणी में देखने के लिए। क्या मैं कुछ भूल रहा हूँ? पेशेवरों/विपक्ष क्या हैं, और ऐसा करने का सबसे अच्छा तरीका क्या है?

+1

आप इस तरह के सलाह के लिए कोई लिंक प्रदान कर सकते हैं: अलग सूचकांक प्रत्येक रंग (बजाय सिर्फ colors की तरह आप ऊपर होगा की) करने के लिए है? – c69

उत्तर

2

आप एक के लिए लूप रंग एक सरणी के रूप में जमा हो जाती है, तो उपयोग करने के लिए नहीं है। तुम बस के रूप में indexOf उपयोग कर सकते हैं,:

if(user.colors.indexOf("yellow") != -1){ 
    //true case 
} 

जिसके अनुसार, यह वास्तव में किसी भी तरह से है कि क्या आप एक एम्बेडेड दस्तावेज़ या सरणी का उपयोग कोई फर्क नहीं करना चाहिए; यह एक या दूसरे की तरह नहीं है एक बड़ा प्रदर्शन लाभ देने जा रहा है।

+0

'यह एक तरह नहीं है या अन्य एक विशाल प्रदर्शन advantage' देने के लिए जा रहा है। क्या यह सच है?! और यदि हां, तो किस पैमाने पर। यदि केवल 8 रंग हैं, तो यह एक बार नगण्य होगा। लेकिन कई रंगों के बारे में क्या, या कई बार लूप में पहुंचा? –

1

आप अक्सर मोंगोडीबी संग्रह में इस प्रकार की जानकारी को स्टोर करने के लिए उपयोग किए गए एम्बेडेड सरणी देखते हैं क्योंकि यदि आप सरणी संपत्ति में एक इंडेक्स जोड़ते हैं तो वे क्वेरी करने में सक्षम होते हैं और वे प्राकृतिक वाक्यविन्यास का उपयोग करते हैं। निम्नलिखित की तरह इस मामले में कुछ में (एक उपयोगकर्ताओं संग्रह है कि एक रंग सरणी प्रॉपर्टी वाला मानते हुए):

db.users.find({id: 1, colors: 'yellow'}) 

आप अलग-अलग रंग गुणों के साथ ऐसा किया, तो आप इस तरह एक अधिक परेशान करने के लिए देख क्वेरी होगा और आप चाहते

db.users.find({id: 1, 'colors.yellow': true}) 
संबंधित मुद्दे