Hello I am new to mongodb and trying to convert objects with different types (int) into key value pairs.
I have collection like this:
{
"_id" : ObjectId("5372a9fc0079285635db14d8"),
"type" : 1,
"stat" : "foobar"
},
{
"_id" : ObjectId("5372aa000079285635db14d9"),
"type" : 1,
"stat" : "foobar"
},
{
"_id" : ObjectId("5372aa010079285635db14da"),
"type" : 2,
"stat" : "foobar"
},{
"_id" : ObjectId("5372aa030079285635db14db"),
"type" : 3,
"stat" : "foobar"
}
I want to get result like this:
{
"type1" : 2, "type2" : 1, "type3" : 1,
"stat" : "foobar"
}
Currently trying aggregation group and then push type values to array
db.types.aggregate(
{$group : {
_id : "$stat",
types : {$push : "$type"}
}}
)
But don't know how to sum different types and to convert it into key values
/* 0 */
{
"result" : [
{
"_id" : "foobar",
"types" : [
1,
2,
2,
3
]
}
],
"ok" : 1
}
Is this close enough for you?
The types are in an array, but it seems to get you the data you are looking for. Code is:
For your actual form, and therefore presuming that you actually know the possible values for "type" then you can do this with two
$group
stages and some use of the$cond
operator:Which gives exactly:
I actually prefer the more dynamic form with two
$group
stages though:Not the same output but functional and flexible to the values:
Otherwise if you need the same output format but need the flexible fields then you can always use mapReduce, but it's not exactly the same output.
And in typical mapReduce style:
But those are your options