2016-01-14 9 views
5

मेरे पास लगभग 168,200,000 दस्तावेज़ों का एक मोंगो डीबी संग्रह है। मैं $ समूह के साथ एक निश्चित फ़ील्ड का औसत प्राप्त करने की कोशिश कर रहा हूं, और मैं क्लाइंट.city पर इंडेक्स का उपयोग करने के लिए पाइपलाइन में $ समूह से पहले $ मैच का उपयोग कर रहा हूं। लेकिन क्वेरी को चलाने में लगभग 5 मिनट लगते हैं, जो बहुत धीमी है।

यहाँ सब मैंने कोशिश कर रहे हैं:

db.ar12.aggregate(
    {$match:{'client.city':'New York'}}, 
    {'$group':{'_id':'client.city', 'avg':{'$avg':'$length'}}} 
) 

db.ar12.aggregate(
    {$match:{'client.city':'New York'}}, 
    {'$group':{'_id':null, 'avg':{'$avg':'$length'}}} 
) 

db.ar12.aggregate(
    {$match:{'client.city':'New York'}}, 
    {$project: {'length':1}}, 
    {'$group':{'_id':null, 'avg':{'$avg':'$length'}}} 
) 

सभी 3 प्रश्नों, client.city साथ दस्तावेजों की संख्या = एक ही समय के बारे में लेने के लिए न्यूयॉर्क के लिए 1,231,672 है, find({'client.city':'New York').count() एक दूसरे लेता है चलाने के लिए

> db.version() 
    3.2.0 

संपादित

यहाँ एक यौगिक जोड़ने के लिए परिणाम की व्याख्या है ... टिप्पणी का सवाल है लंबाई के साथ सूचकांक, कि मदद, हालांकि मैं लंबाई मैं सभी lengthes चाहते द्वारा खोज नहीं कर रहा हूँ ...

{ 
"waitedMS" : NumberLong(0), 
"stages" : [ 
    { 
     "$cursor" : { 
      "query" : { 
       "client.city" : "New York" 
      }, 
      "fields" : { 
       "length" : 1, 
       "_id" : 1 
      }, 
      "queryPlanner" : { 
       "plannerVersion" : 1, 
       "namespace" : "clients.ar12", 
       "indexFilterSet" : false, 
       "parsedQuery" : { 
        "client.city" : { 
         "$eq" : "New York" 
        } 
       }, 
       "winningPlan" : { 
        "stage" : "FETCH", 
        "inputStage" : { 
         "stage" : "IXSCAN", 
         "keyPattern" : { 
          "client.city" : 1 
         }, 
         "indexName" : "client.city_1", 
         "isMultiKey" : false, 
         "isUnique" : false, 
         "isSparse" : false, 
         "isPartial" : false, 
         "indexVersion" : 1, 
         "direction" : "forward", 
         "indexBounds" : { 
          "client.city" : [ 
           "[\"New York\", \"New York\"]" 
          ] 
         } 
        } 
       }, 
       "rejectedPlans" : [ ] 
      } 
     } 
    }, 
    { 
     "$project" : { 
      "length" : true 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : { 
       "$const" : null 
      }, 
      "total" : { 
       "$avg" : "$length" 
      } 
     } 
    } 
], 
"ok" : 1 
} 

संपादित 2

मैं client.city और लंबाई का एक यौगिक सूचकांक, जोड़ा है | लेकिन कोई लाभ नहीं हुआ गति अभी भी बहुत धीमी है, मैं इन 2 प्रश्नों की कोशिश की:

db.ar12.aggregate(
    {$match: {'client.city':'New York'}}, 
    {$project: {'client.city':1, 'length':1}}, 
    {'$group':{'_id':'$client.city', 'avg':{'$avg':'$length'}}} 
) 

ऊपर क्वेरी यौगिक सूचकांक का उपयोग नहीं कर रहा था, इसलिए मैं इस कोशिश की इसे प्रयोग के लिए मजबूर करने, और अभी भी कुछ भी नहीं बदला:

db.ar12.aggregate(
    {$match: { $and : [{'client.city':'New York'}, {'length':{'$gt':0}}]}}, 
    {$project: {'client.city':1, 'length':1}}, 
    {'$group':{'_id':'$client.city', 'avg':{'$avg':'$length'}}} 
) 
नीचे

पिछले क्वेरी के समझाने जाता है:

{ 
"waitedMS" : NumberLong(0), 
"stages" : [ 
    { 
     "$cursor" : { 
      "query" : { 
       "$and" : [ 
        { 
         "client.city" : "New York" 
        }, 
        { 
         "length" : { 
          "$gt" : 0 
         } 
        } 
       ] 
      }, 
      "fields" : { 
       "client.city" : 1, 
       "length" : 1, 
       "_id" : 1 
      }, 
      "queryPlanner" : { 
       "plannerVersion" : 1, 
       "namespace" : "clients.ar12", 
       "indexFilterSet" : false, 
       "parsedQuery" : { 
        "$and" : [ 
         { 
          "client.city" : { 
           "$eq" : "New York" 
          } 
         }, 
         { 
          "length" : { 
           "$gt" : 0 
          } 
         } 
        ] 
       }, 
       "winningPlan" : { 
        "stage" : "CACHED_PLAN", 
        "inputStage" : { 
         "stage" : "FETCH", 
         "inputStage" : { 
          "stage" : "IXSCAN", 
          "keyPattern" : { 
           "client.city" : 1, 
           "length" : 1 
          }, 
          "indexName" : "client.city_1_length_1", 
          "isMultiKey" : false, 
          "isUnique" : false, 
          "isSparse" : false, 
          "isPartial" : false, 
          "indexVersion" : 1, 
          "direction" : "forward", 
          "indexBounds" : { 
           "client.city" : [ 
            "[\"New York\", \"New York\"]" 
           ], 
           "length" : [ 
            "(0.0, inf.0]" 
           ] 
          } 
         } 
        } 
       }, 
       "rejectedPlans" : [ ] 
      } 
     } 
    }, 
    { 
     "$project" : { 
      "client" : { 
       "city" : true 
      }, 
      "length" : true 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : "$client.city", 
      "avg" : { 
       "$avg" : "$length" 
      } 
     } 
    } 
], 
"ok" : 1 
} 
+0

आप एक समझाने और अगर यह सत्यापित चला सकते हैं वास्तव में सूचकांक का उपयोग किया जा रहा है? समेकन व्याख्या जानकारी पर जानकारी के लिए यहां देखें: https://docs.mongodb.org/v3.0/reference/method/db.collection.aggregate/#return-information-on-aggregation-pipeline-operation –

+0

आप भी हो सकते हैं क्लाइंट.city और लंबाई –

+0

पर एक कंपाउंड इंडेक्स रखना चाहते हैं धन्यवाद @ एडम कॉमफोर्ड I ने समझाया का परिणाम जोड़ा ... मैंने पहले देखा और देखा कि यह मेरे सूचकांक का उपयोग कर रहा है ... क्या आपको लगता है कि यौगिक सूचकांक मदद करेगा? – CodeBird

उत्तर

0

मैं एक काम के आसपास पाया है, लंबाई 1 70 तक तो क्या मैंने किया था अजगर मैं 70 1 से दोहराया है से चला जाता है, और प्रत्येक शहर के लिए प्रत्येक लंबाई की गिनती,

db.ar12.find({'client.city':'New York', 'length':i}).count() 

जो बहुत तेजी से है, तो अजगर में औसत गणना की जाती है, इसके बारे में 2 सेकंड चलाने के लिए ले जा रहा है मिल गया।

यह सबसे अच्छा समाधान नहीं है, के बाद से मैं चलाने के लिए अन्य प्रश्न हैं, मैं अगर मैं उन सभी के लिए चारों ओर एक काम पा सकते हैं पता नहीं है ...

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