2012-03-27 13 views
18

आज मैंने देखा है कि जिस क्रम में $ lt और $ gt ऑपरेटरों को दिया गया है, वह मोंगोडीबी 2.0.2 में महत्वपूर्ण है।

मेरे पास गेम का डेटाबेस है। "प्लेयर" दोनों खिलाड़ियों का प्रतिनिधित्व करने वाले दो तारों की एक सरणी है, "एंड एटीएमएस" गेम समाप्त होने पर एक टाइमस्टैम्प है।

db.games.ensureIndex({player:1,endedAtMS:-1}) 

मेरे खेल है जो एक निश्चित समय सीमा में खत्म कर रहे थे, जब तक आदेश दिया के 30 प्राप्त करने के लिए खेल जहां समाप्त हो गया, मुझे क्या करना:

db.games.find({ "player" : "Stefan" , 
       "endedAtMS" : { "$lt" : 1321284969946 , 
           "$gt" : 1301284969946}}). 
     sort({endedAtMS:-1}). 
     limit(30). 
     explain() 

{ 
    "cursor" : "BtreeCursor player_1_endedAtMS_-1", 
    "nscanned" : 30, 
    "nscannedObjects" : 30, 
    "n" : 30, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "player" : [ 
      [ 
       "Stefan", 
       "Stefan" 
      ] 
     ], 
     "endedAtMS" : [ 
      [ 
       1321284969946, 
       -1.7976931348623157e+308 
      ] 
     ] 
    } 
} 

सभी लगता है मैं इस सूचकांक बनाया है बढ़िया कार्य करना।

db.games.find({ "player" : "Stefan" , 
       "endedAtMS" : { "$gt":1301284969946, 
           "$lt" : 1321284969946}}). 
     sort({endedAtMS:-1}). 
     limit(30). 
     explain() 

{ 
    "cursor" : "BtreeCursor player_1_endedAtMS_-1", 
    "nscanned" : 126, 
    "nscannedObjects" : 126, 
    "n" : 30, 
    "millis" : 1, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "player" : [ 
      [ 
       "Stefan", 
       "Stefan" 
      ] 
     ], 
     "endedAtMS" : [ 
      [ 
       1.7976931348623157e+308, 
       1301284969946 
      ] 
     ] 
    } 
} 

आप देख सकते हैं 126 डॉक्स परिणाम के लिए 30 डॉक्स पाने के लिए स्कैन किया जा करने की जरूरत है: हालांकि जब मैं प्रश्न में $ लीटर और $ जीटी का क्रम बदलने के ऊपर मैं इस मिलता है। यदि आप समझाने के आउटपुट में इंडेक्सबाउंड पर एक नज़र डालें तो ऐसा लगता है कि केवल पहले ऑपरेटर का उपयोग इंडेक्स में खोज स्थान को सीमित करने के लिए किया जाता है।

मुझे क्या याद आती है? खोज स्थान को सीमित करने के लिए मोंगो केवल एक ऑपरेटर का उपयोग क्यों कर रहा है?

+0

अच्छा खोज! आइए 10gen लोगों के लिए प्रतीक्षा करें :) –

+0

मैं 2.0.3 के साथ एक ही समस्या (बग?) में आया हूं। [मेरा प्रश्न] देखें (http://stackoverflow.com/questions/9776383/why-are-any-objects-being-scanned-here)। 10gen - हम आपसे प्यार करते हैं - कृपया इसे समझाएं! –

+0

मुझे आश्चर्य है कि 10gen लोग कितनी जल्दी इसे समझ सकते हैं ... एक भावना है कि यह 2.0.4 – Baba

उत्तर

8

यह एक ज्ञात मुद्दा है। संक्षिप्त जवाब यह है कि इसे इस तथ्य के साथ करना है कि एक मल्टीकी इंडेक्स का उपयोग किया जाता है ("प्लेयर" एक सरणी है), और सूचकांक दोनों ऊपरी और निचले सीमाओं पर बाध्य नहीं किया जा सकता है।

यह जिरा मामले में अधिक विस्तार से समझाया गया है: https://jira.mongodb.org/browse/SERVER-4155 - "सूचकांक गलत है?"

इस व्यवहार को बेहतर बनाने के लिए एक खुली जिरा टिकट है: https://jira.mongodb.org/browse/SERVER-4180 - "दिनांक श्रेणी क्वेरी (रिग्रेशन) के लिए गलत इंडेक्सबाउंड उठाए गए हैं जो संस्करण 2.1.2 में रिलीज़ होने के लिए तैयार हैं (यह संस्करण परिवर्तन के अधीन है)। कृपया इसके लिए वोट दें!

+1

आपके उत्तर के लिए धन्यवाद, हालांकि मुझे यकीन नहीं है कि मुझे समझ में आया है कि क्यों सरणी के कारण इंडेक्स को बाधित नहीं किया जा सकता है। यदि आप सरणी में प्रत्येक तत्व के लिए अनुक्रमणिका में एक प्रविष्टि जोड़ते हैं तो इससे कोई फर्क नहीं पड़ता। वैसे भी, दोनों तरफ से इंडेक्स को सीमित करना केवल आंशिक रूप से यहां मदद करेगा। यदि मोंगो अभी भी खोज शुरू करने के लिए सीमा के गलत अंत को चुनता है तो उसे ऊपर दिए गए मेरे उदाहरण में 65 दस्तावेज़ खोजना होगा। मुझे लगता है कि यहां मुख्य मुद्दा खोज शुरू करने के लिए सही अंत चुनना है, फिर परिणाम के लिए 30 डॉक्स को केवल 30 स्कैन के साथ ढूंढने के लिए अन्य सूचकांक की आवश्यकता नहीं है। – StefanMK

+1

जिरा मामले से उदाहरण लें: https://jira.mongodb.org/browse/SERVER-4155: यदि सूचकांक सीमा [2, 9] का उपयोग किया जाता है, तो दस्तावेज़ वापस नहीं किया जाएगा। इसे रोकने के लिए, केवल पहली बाध्य का उपयोग किया जाता है। पहली बाउंड सुविधा के लिए चुना जाता है, कोई तर्क नहीं किया जाता है।जैसा कि ऊपर दिए गए मेरे उत्तर में बताया गया है, हम इस व्यवहार को बेहतर बनाने के लिए काम कर रहे हैं। – Marc

+1

आह ठीक है, धन्यवाद। – StefanMK

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