Вы не можете использовать date aggregation operators на что-нибудь другое, что Тхо сам по себе Date
объекта. Ваш самый лучший вариант - преобразовать эти «строки» в соответствующие Date
объекты, чтобы вы могли правильно запросить в этой и будущих операциях.
Это, если ваши «строки» всегда имеют общую структуру, тогда есть способ сделать это с помощью инструментов aggregation framework. Это требует много манипуляций, которые не делают это «оптимальным» подходом к решению проблемы. Но с заданной структурой «двойных цифр» и последовательным разделителем это возможно с помощью оператора $substr
:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
Так отливка JavaScript не работает в рамках агрегации. Вы всегда можете «подавать» вход в конвейер на основе оценки «клиентского кода», но сам процесс агрегации не оценивает какой-либо код. Как и основной механизм запросов, все это основано на реализации «структуры данных», которая использует инструкции «native operator» для выполнения этой работы.
Вы не можете преобразовать строки в даты в конвейере агрегации. Вы должны работать с реальными объектами BSON Date
, но вы можете сделать это со строками, если есть согласованный формат, который вы можете представить в «лексическом порядке».
Я по-прежнему предлагаю вам преобразовать их в BSON Dates
как можно скорее. И будьте осторожны, что значение «ISODate» или UTC построено с использованием другой строковой формы. т.е.:
new Date("2020-01-07")
Быть в формате "yyyy-mm-dd". По крайней мере, для вызова JavaScript.
спасибо. Это полезно. Это работает . Я согласен с вашими очками. Я сделаю правильную группировку на основе объекта даты bson. – Ramesh
@Ramesh Хорошие новости. Затем вы можете использовать [агенты агрегации даты] (http://docs.mongodb.org/manual/reference/operator/aggregation-date/), как показано в примере вашего исходного кода. –