2016-04-01 159 views
0

我想聚合使用Pymongo與多個字段,但我還沒有找到一種方法來獲得正確的值。Pymongo聚合與多字段

我需要2場拿到總文件數:timestate

time是通過pymongo一個DateTime對象,我能得到的只有YY/MM使用

'$group': { "_id":{ 
      "date":{"$concat": [ 
        {"$substr": [{"$year": "$date"}, 0, 4 ]}, 
        "-", 
        {"$substr": [{"$month": "$date"}, 0, 2 ]}, 
        "-", 
        {"$substr": [{"$dayOfMonth": "$date"}, 0, 2 ]}, 
       ]}}, 
      "count":{"$sum": 1}} 
/DD

這可以得到我提取正確的日期和計數日誌的數量,但現在我需要也分組state所以它變成GROUP BY date, state在mysql

我試着添加它內部_id

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

和它在像{u'count': 4111, u'_id': {u'state': [0, 1]}}格式創建多個輸出,0和1是用於不同的狀態碼。日期無處可尋。

我又試圖

'$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}} 

,我得到了failed: A pipeline stage specification object must contain exactly one field.

這看起來像我沒有在正確的地方括號,但無論怎樣我改變格式,同樣的錯誤遺體。現在我想知道是否真的是支架的問題。最重要的是,我如何正確地做到這一點?

回答

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 } 
} 
+0

我明白了。所以一切都必須在'_id'括號內。我想我現在已經開始工作了。只有一個'count'就行了,對吧?我不需要先計算'date',然後再次計算'state'? – JChao