Group multiple count of values in single field to display

"input":{
   "_id":"1
access_key":12345,
   "name":"anu"
}{
   "_id":2,
   "access_key":12345,
   "name":"babu"
}{
   "_id":3,
   "access_key":12345,
   "name":"chinu"
}{
   "_id":4,
   "access_key":12345,
   "name":"chinu"
}

i want to display the result like this with acces_key and count of name

{
   "access_key":12345,
   "anu":1,
   "babu":1,
   "chinu":2
}

you can use the aggregation pipeline for this

db.test.aggregate([{"$group" : {_id:{"access_key":"$access_key","name":"$name"}, sum:{$sum:1}}},{$sort:{"sum":1}}])
{ "_id" : { "access_key" : 12345, "name" : "anu" }, "sum" : 1 }
{ "_id" : { "access_key" : 12345, "name" : "babu" }, "sum" : 1 }
{ "_id" : { "access_key" : 12345, "name" : "chinu" }, "sum" : 2 }

if you want to filter by access_key

db.test.aggregate([{"$match":{"access_key":12345}},{"$group" : {_id:{"access_key":"$access_key","name":"$name"}, sum:{$sum:1}}},{$sort:{"sum":1}}])
{ "_id" : { "access_key" : 12345, "name" : "anu" }, "sum" : 1 }
{ "_id" : { "access_key" : 12345, "name" : "babu" }, "sum" : 1 }
{ "_id" : { "access_key" : 12345, "name" : "chinu" }, "sum" : 2 }
2 Likes

if the result should be in 1 document, maybe something like

db.test.aggregate([{"$group" : {_id:{"access_key":"$access_key","name":"$name"},"name":{"$push": "$name"}}},{"$group":{"_id": "$_id.access_key","name":{"$push":{"name":"$name","count":{$size:"$name"}}}}}])
{ "_id" : 12345, "name" : [ { "name" : [ "anu" ], "count" : 1 }, { "name" : [ "chinu", "chinu" ], "count" : 2 }, { "name" : [ "babu" ], "count" : 1 } ] }
2 Likes

but there is n no of document how i wil count randomly without mention name values