Я реализую бэкэнд, используя Mongoose и MongoDB с «пользовательскими» документами, такими как:
> db.users.find().pretty()
{
"_id" : ObjectId("5c46eb642c825626124b1e3c"),
"username" : "admin",
"searches" : [
ISODate("2019-01-30T14:52:07Z"),
ISODate("2019-01-30T14:53:40Z"),
ISODate("2019-01-30T14:54:48Z"),
ISODate("2019-02-03T17:11:57Z"),
ISODate("2019-02-04T06:40:00Z")
]
}
Поле поиска представляет собой массив, в котором записывается время, когда пользователь запускает некоторые функции поиска.Я хочу выбрать имя пользователя и вычислить, сколько поисков было выполнено за последний час, день и всего.Моя проблема заключается в получении этих трех значений в одном запросе.
Я использую агрегацию для выбора пользователя, извлечения поисков с раскруткой, запроса по времени, например, дат больше часа назад, и подсчета результатов.
>let now = new Date()
ISODate("2019-02-04T06:56:29.095Z")
>let onehourago = new Date(now.getTime() - 1000 * 3600);
>let yesterday = new Date(now.getTime() - 1000 * 3600 * 24);
>let queryUser = { $match: {username: "admin"}};
>let unwind = { $unwind : "$searches" };
>let queryTime = { $match: {searches: {$gte: onehourago}}};
>let counter = {$count: "lasthour"};
>db.users.aggregate([queryUser, unwind, queryTime, counter])
{ "lasthour" : 1 }
Я хотел бы получить:
{ "lasthour" : 1, "today": 2, "total": 5 }
Бонус, если запрос возвращает 0 вместо пустого, когда нет совпадения (но я могу обойти это в javascript).