Подтвердить что ты не робот

Как агрегировать по дате, когда полная метка времени указана в структуре агрегации?

У меня есть набор ошибок, поэтому каждая ошибка содержит поле date. Как я могу агрегировать/подсчитать/сгруппировать ошибки только через DAY (т.е. Исключить время дня)? Я предполагаю, что нужно использовать умную проекцию.

4b9b3361

Ответ 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}}
], {})