Reputation: 2240
Given data like
[
{ _id:1, data:["abc", "def", "hij", "klm", "nop"]},
{ _id:2, data:["abc", "def", "hij"]},
{ _id:3, data:["abc", "hij"]},
{ _id:4, data:["abc", "def", "hij", "klm", "nop"]},
{ _id:5, data:["def", "hij", "klm"]},
]
I am trying to get a query result like
[
{ "abc": 4 },
{ "def": 4 },
{ "hij": 5 },
{ "klm": 3 },
{ "nop": 2 },
]
where the number is the count of each data property array string value.
I have been working on it from an aggregate pipeline approach, but it seems like there should be an easier way.
Upvotes: 2
Views: 622
Reputation: 149078
You ought to be able to do this with an aggregation pipeline with $unwind
+ $group
. For example:
db.col.aggregate([{$unwind:"$data"}, {$group: {_id: "$data", data: {$sum: 1}}}])
Returns:
{ "_id" : "nop", "data" : 2.0 }
{ "_id" : "abc", "data" : 4.0 }
{ "_id" : "def", "data" : 4.0 }
{ "_id" : "hij", "data" : 5.0 }
{ "_id" : "klm", "data" : 3.0 }
Upvotes: 3