Pymongo聚合与多领域

时间:2016-04-01 01:47:26

标签: python mongodb pymongo aggregation-framework

我尝试使用Pymongo聚合多个字段,但我还没有找到获得正确值的方法。 我需要通过2个字段计算总文件数:时间和状态 时间是通过pymongo的日期时间对象,我只能使用yy / mm / dd ' $ group':{" _id":{             " date":{" $ concat":[                    {" $ substr":[{" $ year":" $ date"},0,4]},                    " - &#34 ;,                    {" $ substr":[{" $ month":" $ date"},0,2]},                    " - &#34 ;,                    {" $ substr":[{" $ dayOfMonth":" $ date"},0,2]},               ]}},              "计算":{" $ sum":1}} 这可以为我提取正确的日期并计算日志的数量,但现在我还需要按状态分组,因此它成为GROUP BY日期,在mysql中的状态 我尝试在_id中添加它 ' $ group':{" _id":{             " date":{" $ concat":[                    {" $ substr":[{" $ year":" $ date"},0,4]},                    " - &#34 ;,                    {" $ substr":[{" $ month":" $ date"},0,2]},                    " - &#34 ;,                    {" $ substr":[{" $ dayOfMonth":" $ date"},0,2]},               ]}},              " _id" {"状态":" $ timeline.state"},              "计算":{" $ sum":1}} 它会以{u' count':4111,u' _id':{u' state':[0,1]}}等格式创建多个输出,0和1是不同状态的代码。这个日期无处可寻。 然后我试过了 ' $ group':{" _id":{             " date":{" $ concat":[                    {" $ substr":[{" $ year":" $ date"},0,4]},                    " - &#34 ;,                    {" $ substr":[{" $ month":" $ date"},0,2]},                    " - &#34 ;,                    {" $ substr":[{" $ dayOfMonth":" $ date"},0,2]},               ]}},              "状态":" $ timeline.state"},              "计算":{" $ sum":1}} 我失败了:管道阶段规范对象必须只包含一个字段。 这看起来我没有在正确的位置得到括号,但无论我如何更改格式,仍然存在相同的错误。现在我想知道它是否真的是支架的问题。最重要的是,我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

您需要在_id阶段使用复合$group字段,如下所示:

"$group": { 
    "_id":{
        "date":{
            "$concat": [
                { "$substr": [ { "$year": "$date" }, 0, 4 ] }, 
                "-", 
                { "$substr": [ { "$month": "$date" }, 0, 2 ] },
                "-",
                { "$substr": [ { "$dayOfMonth": "$date" }, 0, 2 ] }
            ] 
        }, 
        "state": "$timeline.state" 
    },
    "count": { "$sum": 1 } 
}