【问题标题】:MongoDB aggregate group by with conditionMongoDB 通过条件聚合分组
【发布时间】: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_ 正确!更改匹配查询的顺序后,它可以完美运行。谢谢:)

标签: mongodb aggregate pymongo


【解决方案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"
        }
    },
])

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

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2020-02-06
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多