MongoDB 通过条件聚合分组

Posted

技术标签:

【中文标题】MongoDB 通过条件聚合分组【英文标题】:MongoDB aggregate group by with condition 【发布时间】:2021-11-04 21:34:03 【问题描述】:

示例文档


    "user_id": "1",
    "key": "key1",
    "percent": 95
,

    "user_id": "1",
    "key": "key1",
    "percent": 50
,

    "user_id": "1",
    "key": "key2",
    "percent": 50
,

    "user_id": "1",
    "key": "key3",
    "percent": 50
,

    "user_id": "1",
    "key": "key3",
    "percent": 70


我想提取百分比小于 95 的文档。

当有多个文档具有特定键时,一个大于 95,一个小于 95,则不能显示具有该键的文档。 (上例中,key1对应。因为一个大于95,另一个小于95。)

如果所有多个文档的百分比都低于95,则必须提取百分比最高的文档。

我使用的当前查询

db.test.aggregate([
    
        "$match": 
            "percent": 
                "$lte": 95
            ,
            "user_id": 
                "$eq": user_id,
            ,
        
    ,
    
        "$group": 
            "_id": "$key",
            "max": "$max": "$percent"
        
    ,
    
        "$project": 
            "_id": 1,
            "percent": "$max"
        
    ,
])

结果

"key": "key1", "percent": 50
"key": "key2", "percent": 50
"key": "key3", "percent": 70

根据上述条件,key1 应从结果中排除,因为存在百分比为 95 或更高的文档。

预期结果

"key": "key2", "percent": 50
"key": "key3", "percent": 70

这个问题可以用MongoDB的查询解决吗?

谢谢!

【问题讨论】:

您可以尝试在分组之后(而不是之前)检查百分比匹配。 @prasad_ 正确!更改匹配查询的顺序后,它可以完美运行。谢谢:) 【参考方案1】:
db.test.aggregate([
    
        "$match": 
            "user_id": 
                "$eq": user_id,
            ,
        
    ,
    
        "$group": 
            "_id": "$key",
            "max": "$max": "$percent"
        
    ,
    
        "$match": 
            "max": 
                "$lte": 95
            
        
    ,
    
        "$project": 
            "_id": 1,
            "percent": "$max"
        
    ,
])

更改匹配查询顺序后,完美运行。

【讨论】:

以上是关于MongoDB 通过条件聚合分组的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 轻松搞定统计 —— 聚合函数使用

MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则

MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则

MongoDB按聚合查询分组

MongoDB 聚合分组取第一条的案例及实现

MongoDB高级查询多级分组聚合及时间计算应用实践案例