2014-05-12 9 views
7

मैं किसी बड़े संग्रह (3.500.000 दस्तावेज़, 35 जीबी) में किसी दिए गए फ़ील्ड के सभी विशिष्ट मान (10 से कम संभव मानों) को प्राप्त करने का प्रयास करता हूं।क्या मोंगो में बड़े संग्रह में विशिष्ट मूल्य प्राप्त करने का कोई अच्छा तरीका है?

मैंने इन मानों को db.collection.distinct('field') के साथ प्राप्त करने का प्रयास किया, लेकिन यह बहुत धीमा है, भले ही कोई अनुक्रमणिका हो (ऐसा प्रतीत नहीं होता है)।

इस प्रश्न पर प्रदर्शन को बेहतर बनाने के लिए कोई सुझाव?

धन्यवाद

संपादित मैं मोंगो 2.4.9 उपयोग कर रहा था। इसे 2.5.5 (https://jira.mongodb.org/browse/SERVER-2094) में तय किया गया है, लेकिन मेरे पास अभी भी db.logs.distinct("version", {wsId: "XXX" }) जैसे प्रश्नों पर प्रदर्शन समस्या है, भले ही इंडेक्स दोनों फ़ील्ड के लिए मौजूद हों।

+0

क्या आप अपनी दस्तावेज़ संरचना, अनुक्रमणिका और आउटपुट – Sebastian

+0

को समझा सकते हैं मैंने अभी अपना प्रश्न संपादित किया है। मैं 2.4.9 संस्करण का उपयोग कर रहा हूं, ऐसा लगता है कि प्रदर्शन 2.5.5 में सुधार हुआ है। –

+0

संग्रहित दस्तावेज़ बहुत आसान है। यह नेस्टेड फ़ील्ड के बिना एक दस्तावेज़ है, फ़ील्ड (परिणाम कोड) में एक साधारण सूचकांक है। { "वी": 1, "कुंजी": { "resultCode": 1 }, "एनएस": "app_logs.logs", "नाम": "resultCode_1" } –

उत्तर

7

"विशिष्ट" अगर उपलब्ध हो तो सूचकांक का उपयोग करता है। इस तरह इसे चलाने और अगर सूचकांक किया जा रहा है देखें:

db.runCommand({distinct: "collectionNameGoesHere", key:"fieldNameGoesHere"}) 

लौटे परिणाम सेट में अंतिम मान आँकड़े है कि इस तरह दिखता है है:

"stats" : { 
      "n" : 280, 
      "nscanned" : 280, 
      "nscannedObjects" : 0, 
      "timems" : 0, 
      "cursor" : "BtreeCursor class_id_1" 
    } 

सूचना है कि मेरे प्रश्न पर एक सूचकांक का इस्तेमाल किया था class_id फ़ील्ड के बाद से मैंने इसे पूर्व-निर्मित किया था।

+1

मुझे लगता है कि ओपी पहले से ही यह जानता है, उसका प्रश्न अलग-अलग इंडेक्स उपयोग के सबसेट के लिए विशेष है। – Sammaye

+0

दरअसल, मैंने पहले ही ऐसा किया है? मोंगो के अपग्रेड के साथ, अगर मैं एक साधारण विशिष्ट क्वेरी करता हूं तो इंडेक्स का उपयोग अब किया जाता है, लेकिन अगर मैं इस क्वेरी पर कोई शर्त जोड़ता हूं, तो प्रदर्शन भयानक है। –

+2

मैंने db.runCommand का उपयोग किया है ({विशिष्ट: "collectionNameGoesHere", कुंजी: "fieldNameGoesHere"}) लेकिन त्रुटि संदेश मिला। errmsg अपवाद: अलग बहुत बड़ा, 16 एमबी टोपी –

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

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