Агрегация Pymongo с несколькими полями

Я пытаюсь агрегировать с помощью Pymongo несколько полей, но не нашел способа получить правильное значение.

Мне нужно подсчитать общее количество файлов по двум полям: time и state

time - это объект даты и времени через pymongo, и я смог получить только гг/мм/дд, используя

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

Это может получить правильную дату для меня и подсчитать количество журналов, но теперь мне нужно также сгруппировать по state, чтобы в mysql стало GROUP BY date, state

Я пытался добавить его внутрь _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.

Похоже, я не в том месте расставил скобки, но как ни меняю формат, все та же ошибка. Теперь мне интересно, действительно ли это проблема кронштейна. Самое главное, как мне это сделать правильно?


person JChao    schedule 01.04.2016    source источник


Ответы (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 } 
}
person styvane    schedule 01.04.2016
comment
Я понимаю. Так что все должно быть внутри скобки _id. Я думаю, что теперь я получил его на работу. Всего один count будет работать, верно? Мне не нужно как-то считать сначала date, а затем считать state в другой раз? - person JChao; 01.04.2016