stackuser83
stackuser83

Reputation: 2240

get a count of array property values in MongoDB

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

Answers (1)

p.s.w.g
p.s.w.g

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

Related Questions