2012-11-27 11 views
10

मैं (बहु कुंजी) MongoDB पर अनुक्रमण सरणी में तलाश रहे हैं की एक सरणी पर एक सूचकांक को समझना और मैं निम्नलिखित प्रश्न है कि मैं पर ज्यादा प्रलेखन ढूँढने में सक्षम नहीं किया गया है:सहायक दस्तावेज़ों

{field : [ 
    {a : "1"}, 
    {b : "2"}, 
    {c : "3"} 
    ] 
} 

मैं केवल पर field.a और field.c individ की क्वेरी हूँ: सहायक दस्तावेज़ों

की एक सरणी पर इंडेक्स तो अगर मैं एक सरणी क्षेत्र है कि कुछ की तरह लग रहा ually (नहीं दोनों एक साथ), मेरा मानना ​​है कि मैं निम्नलिखित विकल्पों के बीच एक विकल्प है:

  1. db.Collection.ensureIndex({field : 1});
  2. db.Collection.ensureIndex({field.a : 1}); db.Collection.ensureIndex({field.c : 1});

यही कारण है: पूरे सरणी पर एक सूचकांक; या एम्बेडेड फ़ील्ड पर दो इंडेक्स। अब मेरी प्रश्न हैं:

  • कैसे आप विकल्प 1 में पूरे सरणी पर एक सूचकांक कल्पना करते हैं (यह भी उपयोगी है)? इस तरह के एक सूचकांक के लिए उपयोगी क्या प्रश्न है?
  • मैंने बताई गई पूछताछ की स्थिति को देखते हुए, उपर्युक्त दो विकल्पों में से कौन सा बेहतर है, और क्यों?
+2

+1। –

+0

@ सहायता आपने क्या किया? परिणाम कैसे थे? –

+0

@ केविन इस विशिष्ट क्वेरी विकल्प 2 के लिए बेहतर काम किया।यदि आप सरणी की संपूर्ण सामग्री पर समकक्षता के लिए पूछताछ कर रहे हैं, तो विकल्प 1 बेहतर है। –

उत्तर

7

आप आप अपनी क्वेरी अधिक performant बनाने सही है कि अगर आप केवल क्षेत्र सरणी में एक की कीमत पर में जानना चाहते हैं, दोनों अनुक्रमित, एक अर्थ में, में मदद मिलेगी रहे हैं।

> db.zaid.save({field : [{a: 1}, {b: 2}, {c: 3}] }); 
> db.zaid.ensureIndex({field:1}); 
> db.zaid.ensureIndex({"field.a":1}); 

#Query 1 
> db.zaid.find({"field.a":1}) 
{ "_id" : ObjectId("50b4be3403634cff61158dd0"), "field" : [ { "a" : 1 }, { "b" : 2 }, { "c" : 3 } ] } 
> db.zaid.find({"field.a":1}).explain(); 
{ 
    "cursor" : "BtreeCursor field.a_1", 
    "nscanned" : 1, 
    "nscannedObjects" : 1, 
    "n" : 1, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "field.a" : [ 
      [ 
       1, 
       1 
      ] 
     ] 
    } 
} 

#Query 2 
> db.zaid.find({"field.b":1}).explain(); 
{ 
    "cursor" : "BasicCursor", 
    "nscanned" : 1, 
    "nscannedObjects" : 1, 
    "n" : 0, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 

    } 
} 

#Query 3 
> db.zaid.find({"field":{b:1}}).explain(); 
{ 
    "cursor" : "BtreeCursor field_1", 
    "nscanned" : 0, 
    "nscannedObjects" : 0, 
    "n" : 0, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "field" : [ 
      [ 
       { 
        "b" : 1 
       }, 
       { 
        "b" : 1 
       } 
      ] 
     ] 
    } 
} 

सूचना है कि दूसरी क्वेरी उस पर एक सूचकांक नहीं है, भले ही आप सरणी अनुक्रमित, लेकिन तीसरे क्वेरी करता है:

हालांकि, निम्नलिखित 3 प्रश्नों पर एक नजर है। अपने डेटा को पूछने का इरादा रखने के आधार पर अपनी अनुक्रमणिका का चयन करना उतना ही महत्वपूर्ण है जितना कि इंडेक्स स्वयं की आवश्यकता है या नहीं। मोंगो में, यदि आप सावधान नहीं हैं, तो आपकी अनुक्रमणिका की संरचना आपके प्रश्नों के प्रदर्शन पर बहुत बड़ा अंतर डाल सकती है और करता है। मुझे लगता है कि आपका पहला सवाल बताता है।

आपका दूसरा प्रश्न थोड़ा और अधिक खुला है, लेकिन मुझे लगता है कि उत्तर, फिर से, यह है कि आप अपने डेटा से पूछने की अपेक्षा कैसे करते हैं। यदि आप केवल "fields.a" के मानों से मेल खाने में रुचि रखते हैं, तो आपको अन्य इंडेक्स के लिए मेमोरी में कमरे को सहेजना चाहिए, जिसके लिए आपको सड़क की आवश्यकता हो सकती है। यदि, हालांकि, आप सरणी में उन किसी भी आइटम पर क्वेरी करने की समान संभावना रखते हैं, और आप निश्चित रूप से निश्चित हैं कि सरणी असीमित रूप से नहीं बढ़ेगी (कभी भी एक सरणी पर इंडेक्स नहीं जो संभावित रूप से एक अनबाउंड आकार के साथ बढ़ेगा। एक बार सरणी बीएसओएन में 1024 बाइट तक पहुंचने के बाद दस्तावेज़ों को इंडेक्स करने में असमर्थ रहेगी।), तो आपको पूर्ण सरणी को इंडेक्स करना चाहिए। इसका एक उदाहरण कार्ड खेलने के हाथ के लिए एक दस्तावेज़ हो सकता है जिसमें उपयोगकर्ता के हाथ में प्रत्येक कार्ड का वर्णन करने वाला एक सरणी शामिल है। इंडेक्स आकार सीमा से अधिक बहने के डर के बिना आप इस सरणी पर इंडेक्स कर सकते हैं क्योंकि हाथ में 52 से अधिक कार्ड नहीं हो सकते हैं। अच्छी तरह से गठित प्रश्न के लिए

+0

क्या इसका मतलब यह है कि अगर मेरी सरणी आकार में बढ़ेगी, तो भी मैं इसे "fields.a" से अनुक्रमित कर सकता हूं? या मुझे किसी भी रूप में बढ़ती सरणी को इंडेक्स नहीं करना चाहिए? – KevinResoL

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