2014-11-04 2 views
0

У меня есть запрос агрегирования для представления данных линейной диаграммы.Группа MongoDB по длительности

Это выглядит следующим образом:

[ 
{ 
    "$match": { 
     "Category": { 
      "$in": ["Mobile"] 
     }, 
     "StartTime": { 
      "$gte": {"$date": "2014-01-29T00:00:00.000Z"}, 
      "$lt": {"$date": "2014-09-29T00:00:00.000Z"} 
     } 
    } 
}, 
{ 
    "$group": { 
     "_id": { 
      "Category": "$Category", 
      "Country":"$Country", 
      "City":"$City", 
      "day": { 
       "day":{"$dayOfMonth": "$StartTime"}, 
       "month":{"$month":"$month"}, 
       "year":{"$year":"$year"} 
      } 
     }, 
     "UniqueVisits": { 
      "$sum": 1 
     }, 
     "Date": { 
      "$first": "$StartTime" 
     } 
    } 
}, 
{ 
    "$project": { 
     "_id": "$_id.Category", 
     "Header": { 
      "$concat": [{"$substr": [{"$month": "$Date"}, 0,2]}, 
       "/", 
       {"$substr": [{"$dayOfMonth": "$Date"}, 0, 2]}, 
       "/", 
       {"$substr": [{"$year": "$Date"}, 0, 4]}] 
     }, 
     "Name": { 
      "$concat": [ 
       { 
        "$ifNull": ["$_id.Country","notset"] 
       }, 
       "~", 
       { 
        "$ifNull": ["$_id.City","notset"] 
       } 
      ] 
     }, 
     "UniqueVisits": "$UniqueVisits",    
    } 
} 
] 

Он отлично работает. Аналогичным образом у меня есть линейная диаграмма по часам, неделям и месяцам, группируя их с помощью $ hour, $ week, $ month.

Теперь я хочу добавить линейную диаграмму AM/PM, т.е. продолжительность часа от 0-12 до 12-24 и даже утром (6-12), днем ​​(12-18), вечером (18-24), Ночь (0-6)

Любая помощь в том, как я могу достичь группировки на длительность выше. Спасибо заранее.

Например:

данных:

{ "_id" : 1, "Date" : ISODate("2014-10-02T19:44:09Z") } 
{ "_id" : 2, "Date" : ISODate("2014-10-02T20:44:09Z") } 
{ "_id" : 3, "Date" : ISODate("2014-09-03T20:44:09Z") } 
{ "_id" : 4, "Date" : ISODate("2014-09-02T20:44:09Z") } 
{ "_id" : 5, "Date" : ISODate("2014-09-03T00:00:00Z") } 
{ "_id" : 6, "Date" : ISODate("2014-09-03T07:00:00Z") } 
{ "_id" : 7, "Date" : ISODate("2014-09-03T14:00:00Z") } 
{ "_id" : 8, "Date" : ISODate("2014-10-02T20:47:09Z") } 

Что я хочу добиться для AM/PM для группирования каждый день выглядит следующим образом:

{ "_id" : "PM", "Count" : 3, "Date" : ISODate("2014-10-02T19:44:09Z") } 
{ "_id" : "AM", "Count" : 1, "Date" : ISODate("2014-09-03T00:00:00Z") } 
{ "_id" : "AM", "Count" : 4, "Date" : ISODate("2014-09-03T00:00:00Z") } 

И утром, днем, Вечер, ночь выглядит следующим образом:

{ "_id" : "Evening", "Count" : 3, "Date" : ISODate("2014-10-02T19:44:09Z") } 
{ "_id" : "Evening", "Count" : 1, "Date" : ISODate("2014-09-02T20:44:09Z") } 
{ "_id" : "Night", "Count" : 1, "Date" : ISODate("2014-09-03T00:00:00Z") } 
{ "_id" : "Morning", "Count" : 1, "Date" : ISODate("2014-09-03T07:00:00Z") } 
{ "_id" : "Afternoon", "Count" : 1, "Date" : ISODate("2014-09-03T14:00:00Z") } 
{ "_id" : "Evening", "Count" : 1, "Date" : ISODate("2014-09-03T20:44:09Z") } 

ответ

0

Вставка этих деталей в правильное положение вашего $group._id может выполнить вашу цель.

ampm : { 
    $cond : { 
     "if" : { 
      $lt : [ { 
       $hour : "$StartTime" 
      }, 12 ] 
     }, 
     "then" : "AM", 
     "else" : "PM" 
    } 
}, 
segment : { 
    $let : { 
     "vars" : { 
      h : { 
       $hour : "$StartTime" 
      } 
     }, 
     "in" : { 
      $cond : { 
       "if" : { 
        $lt: [ "$$h", 6 ] 
       }, 
       "then" : "Night", 
       "else" : { 
        $cond : { 
         "if" : { 
          $lt : [ "$$h", 12 ] 
         }, 
         "then" : "Morning", 
         "else" : { 
          $cond : { 
           "if" : { 
            $lt : [ "$$h", 18 ] 
           }, 
           "then" : "Afternoon", 
           "else" : "Evening" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Чтобы было легче понять, я вставляю все одно здесь

[ 
{ 
    "$match": { 
     "Category": { 
      "$in": ["Mobile"] 
     }, 
     "StartTime": { 
      "$gte": {"$date": "2014-01-29T00:00:00.000Z"}, 
      "$lt": {"$date": "2014-09-29T00:00:00.000Z"} 
     } 
    } 
}, 
{ 
    "$group": { 
     "_id": { 
      "Category": "$Category", 
      "Country":"$Country", 
      "City":"$City", 
      "day": { 
       "day":{"$dayOfMonth": "$StartTime"}, 
       "month":{"$month":"$month"}, 
       "year":{"$year":"$year"}, 

       // add this part to group by for each day of each month of each year 
       ampm : { 
        $cond : { 
         "if" : { 
          $lt : [ { 
           $hour : "$StartTime" 
          }, 12 ] 
         }, 
         "then" : "AM", 
         "else" : "PM" 
        } 
       }, 
       segment : { 
        $let : { 
         "vars" : { 
          h : { 
           $hour : "$StartTime" 
          } 
         }, 
         "in" : { 
          $cond : { 
           "if" : { 
            $lt: [ "$$h", 6 ] 
           }, 
           "then" : "Night", 
           "else" : { 
            $cond : { 
             "if" : { 
              $lt : [ "$$h", 12 ] 
             }, 
             "then" : "Morning", 
             "else" : { 
              $cond : { 
               "if" : { 
                $lt : [ "$$h", 18 ] 
               }, 
               "then" : "Afternoon", 
               "else" : "Evening" 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
       } 


      } 
     }, 
     "UniqueVisits": { 
      "$sum": 1 
     }, 
     "Date": { 
      "$first": "$StartTime" 
     } 
    } 
}, 
{ 
    "$project": { 
     "_id": "$_id.Category", 
     "Header": { 
      "$concat": [{"$substr": [{"$month": "$Date"}, 0,2]}, 
       "/", 
       {"$substr": [{"$dayOfMonth": "$Date"}, 0, 2]}, 
       "/", 
       {"$substr": [{"$year": "$Date"}, 0, 4]}] 
     }, 
     "Name": { 
      "$concat": [ 
       { 
        "$ifNull": ["$_id.Country","notset"] 
       }, 
       "~", 
       { 
        "$ifNull": ["$_id.City","notset"] 
       } 
      ] 
     }, 
     "UniqueVisits": "$UniqueVisits",    
    } 
} 
] 
+0

я думаю, что это будет группа для AM/PM, но не для AM/PM на каждый день каждого месяца каждого года, правильно? это двойной групповой конвейер, единственный вариант? – Ninad

+0

@Ninad, я сказал, вставляя эти части в этот $ group._id (вы можете вставить в $ group._id.day), который вы выпустили, тогда он будет работать каждый день каждого месяца каждого года. Если вы просто замените всю группу $ group._id, она будет группироваться для каждого дня, игнорируя другие параметры. Я не повторил, что вы сделали. – Wizard

+0

@Ninad, я обновил ответ. Может быть, этот способ легче понять. – Wizard

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