Reputation: 33
I h
{
code : "X1",
elements : ["A", "B", "C", "D"]
},
{
code : "X2",
elements : ["C", "D"]
},
{
code : "X3",
elements : ["A"]
}
...
I would like to know the number of documents present for each type of value in the "elements" array. es. es.
"A" : 2
"B" : 1
"C" : 2
"D" : 2
is it possible with a single query?
Upvotes: 2
Views: 1282
Reputation: 49945
You can $unwind your array to get single document per element and then run $group to count elements:
db.collection.aggregate([
{
$unwind: "$elements"
},
{
$group: {
_id: "$elements",
count: { $sum: 1 }
}
}
])
EDIT: you can use additional group with $replaceRoot and $arrayToObject to return your ids as keys and counts as values:
db.collection.aggregate([
{
$unwind: "$elements"
},
{
$group: {
_id: "$elements",
count: { $sum: 1 }
}
},
{
$group: {
_id: null,
counts: { $push: { k: "$_id", v: "$count" } }
}
},
{
$replaceRoot: {
newRoot: { $arrayToObject: "$counts" }
}
}
])
Upvotes: 4