#mongodb #aggregation-framework
#mongodb #структура агрегации
Вопрос:
Я пытаюсь рассчитать частоту посещений сайта, используя агрегатную функцию Mongo, т.Е.. сколько дней за данную неделю пользователь посещал сайт?
{ "_id" : ObjectId("5f7720caf2b93af8d566bc7c"), "email" : "blah@gmail.com", "timestamp" : ISODate("2020-09-29T17:59:00Z") }
{ "_id" : ObjectId("5f7720dcf2b93af8d566ffb7"), "email" : "blah@gmail.com", "timestamp" : ISODate("2020-09-30T01:01:00Z") }
{ "_id" : ObjectId("5f7721bbf2b93af8d56aadc4"), "email" : "yack@gmail.com", "timestamp" : ISODate("2020-10-01T09:58:00Z") }
{ "_id" : ObjectId("5f771e9ff2b93af8d55c57a9"), "email" : "yack@gmail.com", "timestamp" : ISODate("2020-09-26T04:12:00Z") }
{ "_id" : ObjectId("5f771e9ff2b93af8d55c5f6b"), "email" : "yack@gmail.com", "timestamp" : ISODate("2020-09-26T04:22:00Z") }
{ "_id" : ObjectId("5f771eeaf2b93af8d55dc45c"), "email" : "yack@gmail.com", "timestamp" : ISODate("2020-09-27T04:11:00Z") }
Вывод, который я хотел бы:
[
{ "_id": "blah@gmail.com", "dow" [ 2, 3 ], "visits": 2 }, // Visited Tuesday and Wednesday
{ "_id": "yack@gmail.com", "dow" [ 0, 1, 2, 3, 4, 5 ], "visits": 6 } // Visited Sunday through to Friday
]
Я могу получить каждую пару email / dow в виде записи, но я не уверен, куда идти дальше…
[
{
$group: {
_id: { email: "$email", dow: { $dayOfWeek: "$timestamp" } },
}
}
]
Выводит:
{ "_id" : { "email" : "blah@gmail.com", "dow" : 2 } }
{ "_id" : { "email" : "blah@gmail.com", "dow" : 3 } }
{ "_id" : { "email" : "yack@gmail.com", "dow" : 0 } }
{ "_id" : { "email" : "yack@gmail.com", "dow" : 1 } }
{ "_id" : { "email" : "yack@gmail.com", "dow" : 2 } }
{ "_id" : { "email" : "yack@gmail.com", "dow" : 3 } }
{ "_id" : { "email" : "yack@gmail.com", "dow" : 4 } }
{ "_id" : { "email" : "yack@gmail.com", "dow" : 5 } }
Спасибо!
Ответ №1:
Вы можете использовать другой $group
оператор:
db.collection.aggregate([
{
$group: {
_id: { email: "$email", dow: { $dayOfWeek: "$timestamp" } }
}
},
{
$group: {
_id: "$_id.email",
dow: { $push: "$_id.dow" },
visits: { $sum: 1 }
}
}
])