I'm trying to group a set of documents and count them based on their value:
{ item: "abc1", value: 1 } { item: "abc1", value: 1 } { item: "abc1", value: 11 } { item: "xyz1", value: 2 } I would like to group by item and get in return a count of how many times the value is bigger than 10 and how many times smaller:
{ item: "abc1", countSmaller: 2, countBigger: 1 } { item: "xyz1", countSmaller: 1, countBigger: 0 }
The use of COUNT() function in conjunction with GROUP BY is useful for characterizing our data under various groupings. A combination of same values (on a column) will be treated as an individual group.
SQL – count() with Group By clause The count() function is an aggregate function use to find the count of the rows that satisfy the fixed conditions. The count() function with the GROUP BY clause is used to count the data which were grouped on a particular attribute of the table.
We can use GROUP BY to group together rows that have the same value in the Animal column, while using COUNT() to find out how many ID's we have in each group. It returns a table with three rows (one for each distinct animal).
COUNT() with HAVINGThe HAVING clause with SQL COUNT() function can be used to set a condition with the select statement. The HAVING clause is used instead of WHERE clause with SQL COUNT() function.
What you need is the $cond operator of aggregation framework. One way to get what you want would be:
db.foo.aggregate([ { $project: { item: 1, lessThan10: { // Set to 1 if value < 10 $cond: [ { $lt: ["$value", 10 ] }, 1, 0] }, moreThan10: { // Set to 1 if value > 10 $cond: [ { $gt: [ "$value", 10 ] }, 1, 0] } } }, { $group: { _id: "$item", countSmaller: { $sum: "$lessThan10" }, countBigger: { $sum: "$moreThan10" } } } ]) Note: I have assumed value to numeric rather than String.
Output:
{ "result" : [ { "_id" : "xyz1", "countSmaller" : 1, "countBigger" : 0 }, { "_id" : "abc1", "countSmaller" : 2, "countBigger" : 2 } ], "ok" : 1 }
You need to use the $cond operator. Here 0 is value less than 10 and 1 value greater than 10. This doesn't exactly give you expected output. Perhaps someone will post better answer.
db.collection.aggregate( [ { "$project": { "item": 1, "value": { "$cond": [ { "$gt": [ "$value", 10 ] }, 1, 0 ] } } }, { "$group": { "_id": { "item": "$item", "value": "$value" }, "count": { "$sum": 1 } } }, { "$group": { "_id": "$_id.item", "stat": { "$push": { "value": "$_id.value", "count": "$count" }} } } ] ) Output:
{ "_id" : "abc1", "stat" : [ { "value" : 1, "count" : 2 }, { "value" : 0, "count" : 2 } ] } { "_id" : "xyz1", "stat" : [ { "value" : 0, "count" : 1 } ] } You will need to convert your value to integer or float
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With