【问题标题】:How to get multiple counts in one query for one field?如何在一个查询中为一个字段获取多个计数?
【发布时间】:2016-03-30 03:19:14
【问题描述】:

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

{name:'hi',price:100},
{name:'hi',price:134},
{name:'hi',price:500}

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

有没有办法在 mongoDB 中通过一个查询来做到这一点?有没有办法在不知道 min max 的情况下获取查询?

【问题讨论】:

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您希望.aggregate() 在此处使用$cond 三元运算符来确定$group 的分组ID:

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”中的表达式,然后返回第二个参数“then”true 或第三个“else”false .

级联逻辑意味着您将每个三元运算“嵌套”在false 断言中,直到获得最终结果。

使用条件提供的分组_id 值,然后您只需使用$sum1 参数来“计数”组中的匹配项。

这会给你一个关于样本的响应:

{ "_id": "100-200", "count": 2 }
{ "_id": "400-500", "count": 1 }

$match 确保所有结果都在将要测试的“范围”内。如果您排除它,那么如果 "price" 超出预期的“范围”,您可能希望最后一个 $cond“else”条件返回另一个值。

如果您希望返回“每个”范围,那么您最好检查结果并为每个未返回的范围插入一个 0 计数条目。

【讨论】:

  • 如果我不知道最小值和最大值,我想得到最小值和最大值之间的 5 个值怎么办。示例最小值为 1000,最大值为 5000。我可以自动进行查询以计算这些数字之间的数量吗?
  • @Marcio 请阅读。我在答案中准确地说明了这种情况。只需返回带有“未知”的“最后一个”$cond“else”条件。如果这是您所要求的,那么没有什么会为您“生成”范围。您需要将每个条件指定为$cond。如前所述,$match 只是“优化”,不是必需的。
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 2023-01-27
  • 2017-09-13
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多