如何在一个字段的一个查询中获取多个计数?

时间:2016-03-30 03:19:15

标签: mongodb mongodb-query aggregation-framework

所以我想要做的是根据最小最大值获得一个字段的多个计数。 集合中包含类似

的内容
{name:'hi',price:100},
{name:'hi',price:134},
{name:'hi',price:500}

我想得到的是例如价格在100-200之间,200-300,300-400,400-500之间的物品数量。

有没有办法在一个查询的mongoDB中执行此操作?有没有办法在不知道min max的情况下获取查询?

1 个答案:

答案 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计数条目。