Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pymongo和聚合框架查询_Python_Mongodb_Pymongo_Aggregation Framework - Fatal编程技术网

Python Pymongo和聚合框架查询

Python Pymongo和聚合框架查询,python,mongodb,pymongo,aggregation-framework,Python,Mongodb,Pymongo,Aggregation Framework,我试着用pymongo编写聚合查询,但我自己做不到,我试过文档,试过谷歌,试过堆栈溢出,我就是找不到答案。我的数据样本: {"_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": "

我试着用pymongo编写聚合查询,但我自己做不到,我试过文档,试过谷歌,试过堆栈溢出,我就是找不到答案。我的数据样本:

{"_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,因为我很懒。

这里基本上要查找的是运算符。这是一个“三元”条件,其计算结果是从逻辑条件的
true/false
返回一个值

在这种情况下,每个“逻辑”测试都会查看当前的“值”字段,并确定测试的
true
位置,例如是返回正值还是返回
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
                ]
            }
        }

    }}
])
在样本上产生以下结果:

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

这就是我错过的,$cond使它变得非常简单。尽管聚合查询中括号的数量仍然庞大。谢谢你的帮助!