У меня есть коллекция под названием Document в MongoDB. Документы в этой коллекции имеют поле под названием CreationDate, хранящееся в типе даты ISO. Моя задача - подсчитать количество документов, созданных за день, и отсортировать по числу асинхронно. Формат вывода должен быть [{_id: 'yyyy-MM-dd', cnt: x}]. Я попытался использовать структуру агрегации, как показано ниже.
db.Document.aggregate(
, {$project: {_id:1, Year:{$year:'$CreationDate'}, Month:{$month:'$CreationDate'}, Date:{$dayOfMonth:'$CreationDate'}}}
, {$group: {_id:{$concat:['$Year', '-', '$Month', '-', '$Date']}, cnt:{$sum:1}}}
, {$sort:{'cnt':-1}}
);
Код дает мне ошибку, как показано ниже:
$concat only supports strings, not NumberInt32
Я так понимаю, потому что $year, $month и $dayOfMonth все возвращают число. Возможно составить поле _id в качестве объекта и переформатировать его в желаемом формате на уровне приложения.
Но с технической точки зрения у меня есть два вопроса:
-
Как преобразовать число в строку в оболочке MongoDB? В этом случае вывод $year можно затем преобразовать в строку и использовать в $concat.
-
Есть ли лучший способ форматировать вывод ISODate в различные форматы даты? Во многих случаях нам нужна определенная часть ISODate, например: компонент даты или временная часть. Есть ли встроенные операторы MongoDb для достижения этого?
Заранее благодарим за любой совет.