所以我想要做的是根据最小最大值获得一个字段的多个计数。 集合中包含类似
的内容{name:'hi',price:100},
{name:'hi',price:134},
{name:'hi',price:500}
我想得到的是例如价格在100-200之间,200-300,300-400,400-500之间的物品数量。
有没有办法在一个查询的mongoDB中执行此操作?有没有办法在不知道min max的情况下获取查询?
答案 0 :(得分:1)
您希望.aggregate()
与$cond
三元运算符一起确定分组ID $group
:
db.collection.aggregate([
{ "$match": {
"price": { "$gte": 100, "$lte" 500 }
}},
{ "$group": {
"_id": {
"$cond": [
{ "$lte": [ "$price", 200 ] },
"100-200",
{ "$cond": [
{ "$lte": [ "$price", 300 ] },
"200-300",
{ "$cond": [
{ "$lte": [ "$price", 400 ] },
"300-400",
"400-500"
]}
]}
]
},
"count": { "$sum": 1 }
}}
])
作为一个"三元" if/then/else
$cond
将评估第一个参数中的表达式" if"然后要么返回第二个参数"那么"其中true
或第三个"其他"其中false
。
级联逻辑意味着你"嵌套" false
断言中的每个三元操作,直到达到最终结果。
通过条件提供的分组_id
值,您只需使用$sum
参数1
来计算"计数"小组中的比赛。
这会让您对样本做出响应:
{ "_id": "100-200", "count": 2 }
{ "_id": "400-500", "count": 1 }
$match
确保所有结果都在"范围内"那将被测试。如果你排除那么你可能想要一个最后$cond
"否则"如果"price"
超出预期"范围"则返回另一个值。
如果您希望返回"每个"范围,那么你最好检查结果并为每个未返回的范围插入0
计数条目。