2017-09-28 15 views
5

का उपयोग करके कई फ़ील्ड की अलग-अलग गिनती मैं कई क्षेत्रों के अलग-अलग मानों को गिनने की कोशिश कर रहा हूं, एक मोंगोडीबी एकत्रीकरण क्वेरी द्वारा।मोंगोडब एग्रीगेशन

तो यहाँ अपने डेटा है:

{ 
    "car_type": "suv", 
    "color": "red", 
    "num_doors": 4 
}, 
{ 
    "car_type": "hatchback", 
    "color": "blue", 
    "num_doors": 4 
}, 
{ 
    "car_type": "wagon", 
    "color": "red", 
    "num_doors": 4 
} 

मैं प्रत्येक क्षेत्र की एक अलग गिनती हैं:

distinct_count_car_type=3 
distinct_count_color=2 
distinct_count_num_doors=1 

मैं समूह से अधिक फ़ील्ड करने में सक्षम था और फिर एक अलग गिनती है, लेकिन यह केवल दे सकता है मुझे पहले क्षेत्र पर एक गिनती है। इनमें से सभी नहीं। और यह भी डेटा का एक बड़ा सेट है।

उत्तर

1

आप की ... $objectToArray शक्ति की तलाश कर रहे हैं!

db.foo.aggregate([ 
    {$project: {x: {$objectToArray: "$$CURRENT"}}} 
    ,{$unwind: "$x"} 
    ,{$match: {"x.k": {$ne: "_id"}}} 
    ,{$group: {_id: "$x.k", y: {$addToSet: "$x.v"}}} 
    ,{$addFields: {size: {"$size":"$y"}} } 
        ]); 

यह निकलेगा:

{ "_id" : "num_doors", "y" : [ 4 ], "size" : 1 } 
{ "_id" : "color", "y" : [ "blue", "red" ], "size" : 2 } 
{ 
    "_id" : "car_type", 
    "y" : [ 
     "wagon", 
     "hatchback", 
     "suv" 
    ], 
    "size" : 3 
} 

आप कर सकते हैं $project या $addFields के रूप में आप शामिल हैं या अद्वितीय मान या आकार के सेट को हटा फिट देखते हैं।

+0

दुर्भाग्य से मैं मोंगोड 3.2 और $ ऑब्जेक्ट का उपयोग कर रहा हूं, मुझे लगता है कि मैनुअल के अनुसार 3.4 में पेश किया गया था। – Deckard

+0

सही। मैं 3.4.4 पर अपग्रेड की अनुशंसा करता हूं। –

+0

इसलिए मैंने अपग्रेड किया और आपके समाधान का प्रयास किया। अब मेरे पास उन गतिशील फ़ील्ड हैं जो मैं एक अलग गिनती करना चाहता हूं वास्तव में एक सरणी में हैं क्योंकि वे किसी अन्य संग्रह से $ लुकअप से हैं। प्रश्न के शीर्ष पर संग्रह $ लुकअप के कारण मेरे परिणामों पर एक सरणी में है। तो जब मैं फ़ील्ड पर $ ऑब्जेक्ट टॉअरे को करने का प्रयास करता हूं तो मुझे "$ ऑब्जेक्ट प्राप्त होता है। ऑर्रे को दस्तावेज़ इनपुट की आवश्यकता होती है, मिली: सरणी"। और मैंने $ array को ऑब्जेक्ट करने की कोशिश की, शायद उस पर $ ऑब्जेक्ट को कॉल करने में सक्षम हो और मुझे "$ arrayToObject को 'कुंजी' और 'v' की ऑब्जेक्ट कुंजियों की आवश्यकता हो। कुंजी की गलत संख्या मिली: 5"। – Deckard

4

निम्नलिखित कुल पाइपलाइन चल रहा है आप इच्छित परिणाम देना चाहिए:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": null, 
      "distinct_car_types": { "$addToSet": "$car_type" }, 
      "distinct_colors": { "$addToSet": "$color" }, 
      "distinct_num_doors": { "$addToSet": "$num_doors" } 
     } 
    }, 
    { 
     "$project": { 
      "distinct_count_car_type": { "$size": "$distinct_car_types" }, 
      "distinct_count_color": { "$size": "$distinct_colors" }, 
      "distinct_count_num_doors": { "$size": "$distinct_num_doors" } 
     } 
    } 
]) 
+0

अच्छा, और आप प्रक्षेपण में '_id: 0' भी जोड़ सकते हैं;)। –

+0

यह काम करता है। धन्यवाद! यह थोड़ा धीमा हो जाता है लेकिन बहुत ज्यादा नहीं। मुझे एक नया प्रश्न बनाने की आवश्यकता हो सकती है, लेकिन क्या होगा यदि उन वस्तुओं में गतिशील संख्या के क्षेत्र शामिल हों (जिसका अर्थ है कि मैं समय से पहले फ़ील्ड नाम को हार्ड कोड नहीं कर पाऊंगा)। क्या मेरे मानचित्र में किसी भी फ़ील्ड पर अलग-अलग गणना करने का कोई तरीका है? मैं यह कैसे कर सकता हूं? – Deckard

+1

@ डेकार्ड नीचे देखें। –

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