У меня есть запрос агрегирования для представления данных линейной диаграммы.Группа MongoDB по длительности
Это выглядит следующим образом:
[
{
"$match": {
"Category": {
"$in": ["Mobile"]
},
"StartTime": {
"$gte": {"$date": "2014-01-29T00:00:00.000Z"},
"$lt": {"$date": "2014-09-29T00:00:00.000Z"}
}
}
},
{
"$group": {
"_id": {
"Category": "$Category",
"Country":"$Country",
"City":"$City",
"day": {
"day":{"$dayOfMonth": "$StartTime"},
"month":{"$month":"$month"},
"year":{"$year":"$year"}
}
},
"UniqueVisits": {
"$sum": 1
},
"Date": {
"$first": "$StartTime"
}
}
},
{
"$project": {
"_id": "$_id.Category",
"Header": {
"$concat": [{"$substr": [{"$month": "$Date"}, 0,2]},
"/",
{"$substr": [{"$dayOfMonth": "$Date"}, 0, 2]},
"/",
{"$substr": [{"$year": "$Date"}, 0, 4]}]
},
"Name": {
"$concat": [
{
"$ifNull": ["$_id.Country","notset"]
},
"~",
{
"$ifNull": ["$_id.City","notset"]
}
]
},
"UniqueVisits": "$UniqueVisits",
}
}
]
Он отлично работает. Аналогичным образом у меня есть линейная диаграмма по часам, неделям и месяцам, группируя их с помощью $ hour, $ week, $ month.
Теперь я хочу добавить линейную диаграмму AM/PM, т.е. продолжительность часа от 0-12 до 12-24 и даже утром (6-12), днем (12-18), вечером (18-24), Ночь (0-6)
Любая помощь в том, как я могу достичь группировки на длительность выше. Спасибо заранее.
Например:
данных:
{ "_id" : 1, "Date" : ISODate("2014-10-02T19:44:09Z") }
{ "_id" : 2, "Date" : ISODate("2014-10-02T20:44:09Z") }
{ "_id" : 3, "Date" : ISODate("2014-09-03T20:44:09Z") }
{ "_id" : 4, "Date" : ISODate("2014-09-02T20:44:09Z") }
{ "_id" : 5, "Date" : ISODate("2014-09-03T00:00:00Z") }
{ "_id" : 6, "Date" : ISODate("2014-09-03T07:00:00Z") }
{ "_id" : 7, "Date" : ISODate("2014-09-03T14:00:00Z") }
{ "_id" : 8, "Date" : ISODate("2014-10-02T20:47:09Z") }
Что я хочу добиться для AM/PM для группирования каждый день выглядит следующим образом:
{ "_id" : "PM", "Count" : 3, "Date" : ISODate("2014-10-02T19:44:09Z") }
{ "_id" : "AM", "Count" : 1, "Date" : ISODate("2014-09-03T00:00:00Z") }
{ "_id" : "AM", "Count" : 4, "Date" : ISODate("2014-09-03T00:00:00Z") }
И утром, днем, Вечер, ночь выглядит следующим образом:
{ "_id" : "Evening", "Count" : 3, "Date" : ISODate("2014-10-02T19:44:09Z") }
{ "_id" : "Evening", "Count" : 1, "Date" : ISODate("2014-09-02T20:44:09Z") }
{ "_id" : "Night", "Count" : 1, "Date" : ISODate("2014-09-03T00:00:00Z") }
{ "_id" : "Morning", "Count" : 1, "Date" : ISODate("2014-09-03T07:00:00Z") }
{ "_id" : "Afternoon", "Count" : 1, "Date" : ISODate("2014-09-03T14:00:00Z") }
{ "_id" : "Evening", "Count" : 1, "Date" : ISODate("2014-09-03T20:44:09Z") }
я думаю, что это будет группа для AM/PM, но не для AM/PM на каждый день каждого месяца каждого года, правильно? это двойной групповой конвейер, единственный вариант? – Ninad
@Ninad, я сказал, вставляя эти части в этот $ group._id (вы можете вставить в $ group._id.day), который вы выпустили, тогда он будет работать каждый день каждого месяца каждого года. Если вы просто замените всю группу $ group._id, она будет группироваться для каждого дня, игнорируя другие параметры. Я не повторил, что вы сделали. – Wizard
@Ninad, я обновил ответ. Может быть, этот способ легче понять. – Wizard