अपने वास्तविक रूप के लिए, और इसलिए यह मानते हुए कि आप वास्तव में "प्रकार" के संभावित मूल्यों को जानते हैं, तो आप इसे दो $समूह
चरणों और $condके कुछ उपयोग कोड>
ऑपरेटर:
db.types.aggregate([
{ "$group": {
"_id": {
"stat": "$stat",
"type": "$type"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.stat",
"type1": { "$sum": { "$cond": [
{ "$eq": [ "$_id.type", 1 ] },
"$count",
0
]}},
"type2": { "$sum": { "$cond": [
{ "$eq": [ "$_id.type", 2 ] },
"$count",
0
]}},
"type3": { "$sum": { "$cond": [
{ "$eq": [ "$_id.type", 3 ] },
"$count",
0
]}}
}}
])
जो बिल्कुल देता है:
{ "_id" : "foobar", "type1" : 2, "type2" : 1, "type3" : 1 }
मैं वास्तव में दो के साथ अधिक गतिशील रूप पसंद करता हूं $ समूह
हालांकि चरण:
db.types.aggregate([
{ "$group": {
"_id": {
"stat": "$stat",
"type": "$type"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.stat",
"types": { "$push": {
"type": "$_id.type",
"count": "$count"
}}
}}
])
समान आउटपुट नहीं बल्कि कार्यात्मक और मूल्यों के लिए लचीला:
{
"_id" : "foobar",
"types" : [
{
"type" : 3,
"count" : 1
},
{
"type" : 2,
"count" : 1
},
{
"type" : 1,
"count" : 2
}
]
}
अन्यथा यदि आपको समान आउटपुट स्वरूप की आवश्यकता है लेकिन लचीले फ़ील्ड की आवश्यकता है तो आप हमेशा mapReduce का उपयोग कर सकते हैं, लेकिन यह बिल्कुल समान आउटपुट नहीं है।
db.types.mapReduce(
function () {
var obj = { };
var key = "type" + this.type;
obj[key] = 1;
emit( this.stat, obj );
},
function (key,values) {
var obj = {};
values.forEach(function(value) {
for ( var k in value ) {
if ( !obj.hasOwnProperty(k) )
obj[k] = 0;
obj[k]++;
}
});
return obj;
},
{ "out": { "inline": 1 } }
)
और सामान्य मानचित्र में शैली कम करें:
"results" : [
{
"_id" : "foobar",
"value" : {
"type1" : 2,
"type2" : 1,
"type3" : 1
}
}
],
लेकिन ये आपके विकल्प हैं