В mongodb у меня есть коллекция документов с массивом записей, которые я хочу сгруппировать по похожим тегам, сохраняя естественный порядок
{
"day": "2019-01-07",
"records": [
{
"tag": "ch",
"unixTime": ISODate("2019-01-07T09:06:56Z"),
"score": 1
},
{
"tag": "u",
"unixTime": ISODate("2019-01-07T09:07:06Z"),
"score": 0
},
{
"tag": "ou",
"unixTime": ISODate("2019-01-07T09:07:06Z"),
"score": 0
},
{
"tag": "u",
"unixTime": ISODate("2019-01-07T09:07:20Z"),
"score": 0
},
{
"tag": "u",
"unixTime": ISODate("2019-01-07T09:07:37Z"),
"score": 1
}
]
Я хочу сгруппировать (и агрегировать) записи по аналогичной последовательности тегов, а НЕ просто путем группировки уникальных тегов
Желаемый вывод:
{
"day": "2019-01-07",
"records": [
{
"tag": "ch",
"unixTime": [ISODate("2019-01-07T09:06:56Z")],
"score": 1
"nbRecords": 1
},
{
"tag": "u",
"unixTime": [ISODate("2019-01-07T09:07:06Z")],
"score": 0,
"nbRecords":1
},
{
"tag": "ou",
"unixTime": [ISODate("2019-01-07T09:07:06Z")],
"score": 0
},
{
"tag": "u",
"unixTime: [ISODate("2019-01-07T09:07:20Z"),ISODate("2019-01-07T09:07:37Z")]
"score": 1
"nbRecords":2
}
]
GroupBy
Похоже, что оператор агрегации $ groupby в mongodb ранее сортировал массив и группу по уникальному полю
db.coll.aggregate(
[
{"$unwind":"$records"},
{"$group":
{
"_id":{
"tag":"$records.tag",
"day":"$day"
},
...
}
}
]
)
Возвращает
{
"day": "2019-01-07",
"records": [
{
"tag": "ch",
"unixTime": [ISODate("2019-01-07T09:06:56Z")],
"score": 1
"nbRecords": 1
},
{
"tag": "u",
"unixTime": [ISODate("2019-01-07T09:07:06Z"),ISODate("2019-01-07T09:07:20Z"),ISODate("2019-01-07T09:07:37Z")],
"score": 2,
"nbRecords":3
},
{
"tag": "ou",
"unixTime": [ISODate("2019-01-07T09:07:06Z")],
"score": 0
},
]
Карта / уменьшить
Поскольку в настоящее время я использую драйвер pymongo, я реализовал решение обратно в python.
используя itertools.groupby, который в качестве генератора выполняет группировку в соответствии с естественным порядком, но я сталкиваюсь с проблемой тайм-аута сервера (cursor.NotFound Error) в качестве безумной обработки времени.
Любая идея о том, как напрямую использовать функцию mapreduce mongo
выполнить эквивалент itertools.groupby()
в python?
Помощь была бы очень признательна: я использую драйвер pymongo 3.8 и MongoDB 4.0