2014-11-04 64 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 2014-11-05 05:25:06

+0

@Ninad,我说将这些部分插入$ group._id(你可以插入到$ group._id.day),然后你可以在每个月的每个月的每一天工作。如果你只是替换整个$ group._id,那么它将为每一天忽略其他选项而进行分组。我没有重复你所做的。 – Wizard 2014-11-05 05:51:47

+0

@Ninad,我更新了答案。也许这种方式更容易理解。 – Wizard 2014-11-05 06:05:43