python - Pymongo 和聚合框架查询

标签 python mongodb pymongo aggregation-framework

我尝试在 pymongo 中编写聚合查询,但我自己做不到,我尝试过文档,尝试过谷歌,尝试过 Stack Overflow,但我只是找不到答案。我的数据样本:

{"_id": id, "site": "site A", "weekday": 1, "value": 1}
{"_id": id, "site": "site B", "weekday": 2, "value": 0}
{"_id": id, "site": "site C", "weekday": 3, "value": 1}
{"_id": id, "site": "site A", "weekday": 2, "value": 0}
{"_id": id, "site": "site B", "weekday": 3, "value": -1}
{"_id": id, "site": "site C", "weekday": 2, "value": 1}
{"_id": id, "site": "site A", "weekday": 1, "value": -1}
{"_id": id, "site": "site B", "weekday": 3, "value": 1}

我需要的是:

对于单个站点,假设“站点 A”,我需要每个工作日的字典列表(总共 7 个),其中“值”的数量大于 0、等于 0 和小于 0。全部按工作日排序。

所以我的输出应该是这样的:

{"weekday": 1, "greaterCount": x, "lesserCount": y, "zeroCount": z}
{"weekday": 2, "greaterCount": x, "lesserCount": y, "zeroCount": z}
{"weekday": 3, "greaterCount": x, "lesserCount": y, "zeroCount": z}
{"weekday": 4, "greaterCount": x, "lesserCount": y, "zeroCount": z}
{"weekday": 5, "greaterCount": x, "lesserCount": y, "zeroCount": z}
{"weekday": 6, "greaterCount": x, "lesserCount": y, "zeroCount": z}
{"weekday": 7, "greaterCount": x, "lesserCount": y, "zeroCount": z}

当然,不同工作日的greaterCount、lesserCount和zeroCount的值会有所不同,因为我很懒,所以我的示例输出中的每个字典中都有x、y和z。

最佳答案

您在这里基本上要寻找的是 $cond运算符(operator)。这是一个“三元”条件,其计算结果是从逻辑条件的 true/false 返回一个值。

在这种情况下,每个“逻辑”测试都会查看当前的“值”字段,并确定测试的 true 位置,例如 $gt是否向 $sum 返回正值或改为 0 值:

db.collection.aggregate([ 
    { "$group": {
        "_id": "$weekday",
        "greaterCount": {
            "$sum": {
                "$cond": [
                    { "$gt": [ "$value", 0 ] },
                    1,
                    0
                ]
            }
        },
        "lesserCount": {
            "$sum": {
                "$cond": [
                    { "$lt": [ "$value", 0 ] },
                    1,
                    0
                ]
            }
        },
        "zeroCount": {
            "$sum": {
                "$cond": [
                    { "$eq": [ "$value", 0 ] },
                    1,
                    0
                ]
            }
        }

    }}
])

sample 产生的结果:

{ "_id" : 3, "greaterCount" : 2, "lesserCount" : 1, "zeroCount" : 0 }
{ "_id" : 2, "greaterCount" : 1, "lesserCount" : 0, "zeroCount" : 2 }
{ "_id" : 1, "greaterCount" : 1, "lesserCount" : 1, "zeroCount" : 0 }

关于python - Pymongo 和聚合框架查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32481171/

相关文章:

python - 转换以元组为键的嵌套字典到数据帧

javascript - Mongoose find().exec() promise 问题

mongodb - save 在 pymongo 中被弃用了?

javascript - MongoDB - 如何在 $slice 投影中使用字段值?

python - Pymongo 的 update_one() 返回带有 AttributeError 的 UpdateResult

python - 编写 'or' 语句的有效方法

Python Subprocess call() 不执行shell命令

python - 值错误: cannot reindex from a duplicate axis using groupy and apply pct_change in Pandas

javascript - Try/Catch 捕获 promise 拒绝...有什么办法解决这个问题吗?

mongodb - 如何映射减少组、排序和计数排序值