2015-01-08 2 views
2

Я имею поле СТРОКА-ДАТЫ в коллекцииMongoDb Как группировать по месяцам и годам из строки

{ .... "dateStr" : "07/01/2020" .... } 
    { .... "dateStr" : "07/01/1970" .... } 

Я хочу группы по месяцу и году с месторождения СТРОКА-ДАТЫ

Я попытался

db.collection.aggregate( 
     {$project : { 
       month : {$month : new Date("$dateStr")}, 
       year : {$year : new Date("$dateStr")} 
      }}, 
     {$group : { 
       _id : {month : "$month" ,year : "$year" }, 
       count : {$sum : 1} 
     }}) 

Выход:

{ 
"result" : [ 
     { 
      "_id" : { 
       "month" : 1, 
       "year" : 1970 
      }, 
      "count" : 2 
     } 
    ], 
    "ok" : 1 
} 

Но у меня два года 1970-2020. Почему я получаю одиночную запись?

ответ

4

Вы не можете использовать 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.

+0

спасибо. Это полезно. Это работает . Я согласен с вашими очками. Я сделаю правильную группировку на основе объекта даты bson. – Ramesh

+0

@Ramesh Хорошие новости. Затем вы можете использовать [агенты агрегации даты] (http://docs.mongodb.org/manual/reference/operator/aggregation-date/), как показано в примере вашего исходного кода. –

Смежные вопросы