У меня есть набор ошибок, поэтому каждая ошибка содержит поле date
. Как я могу агрегировать/подсчитать/сгруппировать ошибки только через DAY (т.е. Исключить время дня)? Я предполагаю, что нужно использовать умную проекцию.
Как агрегировать по дате, когда полная метка времени указана в структуре агрегации?
Ответ 1
Вы можете сделать это, используя следующие агрегирующие операторы:
Это дает вам количество ошибок для каждой даты:
db.errors.aggregate(
{ $group : {
_id: {
year : { $year : "$date" },
month : { $month : "$date" },
day : { $dayOfMonth : "$date" },
},
count: { $sum: 1 }
}}
);
В этом примере предполагается, что поле даты в ваших документах ошибок date
и типа Дата BSON. Существует также тип Timestamp в MongoDB, но использование этого типа явно обескуражено документацией:
Примечание. Тип временной отметки BSON предназначен для внутреннего использования MongoDB. Для большинства случаях, при разработке приложений, вы захотите использовать дату BSON тип. См. "Дата" для получения дополнительной информации.
Ответ 2
Вы можете преобразовать поле timestamp в строку с определенным форматом даты, используя $project (aggregation)
aggregate([
{
'$project': {
newFieldName: {'$dateToString': {format: '%Y-%m-%d', date: '$yourDateFieldName'}}
}
}, {
'$group': {
_id: {newFieldName: '$newFieldName'},
viewCount: {'$sum': 1}
}
},
{'$sort': {'_id.newFieldName': 1}}
], {})