使用mongodb获取两个条目之间的天数

时间:2016-11-30 09:11:49

标签: mongodb

我想知道我的两个最后一个条目之间的天数,mongoDb按天数分组。这是我的表:


-------------------------------------------------
| mac address                | date             |
-------------------------------------------------
| aa:bb:cc:dd:ee:ff          | 2016-11-15       |
| aa:bb:cc:dd:ee:ff          | 2016-11-19       |
| aa:bb:cc:dd:ee:ff          | 2016-11-20       |
| ff:ee:dd:cc:bb:aa          | 2016-11-19       |
| ff:ee:dd:cc:bb:aa          | 2016-11-28       |
| aa:aa:aa:aa:aa:aa          | 2016-11-21       |
| bb:bb:bb:bb:bb:bb          | 2016-11-22       |
| bb:bb:bb:bb:bb:bb          | 2016-11-25       |
| cc:cc:cc:cc:cc:cc          | 2016-11-20       |
| cc:cc:cc:cc:cc:cc          | 2016-11-23       |
-------------------------------------------------

这就是我想要的:

-------------------------------------------------
| Number of days             | count            |
-------------------------------------------------
| 1 day                      | 1                |
| 2-7 days                   | 2                |
| 8-30 days                  | 1                |
| > 30 days                  | 0                |
-------------------------------------------------

是否有可能使用mongodb在一个请求中执行此操作?

非常感谢。

1 个答案:

答案 0 :(得分:3)

你可以在一个像这样的

的查询中完成
   db.date.aggregate([
   {
      $sort:{
         date:-1
      }
   },
   {
      $group:{
         _id:"$mac",
         date:{
            $push:"$date"
         }
      }
   },
   {
      $project:{
         _id:"$mac",
         laps:{
            $subtract:[
               {
                  $arrayElemAt:[
                     "$date",
                     0
                  ]
               },
               {
                  $arrayElemAt:[
                     "$date",
                     1
                  ]
               }
            ]
         }
      }
   },
   {
      "$group":{
         "_id":null,
         "1_day":{
            "$sum":{
               "$cond":[
                  {
                     "$lte":[
                        "$laps",
                        (1000 *60 * 60 * 24)
                     ]
                  },
                  1,
                  0
               ]
            }
         },
         "2_7days":{
            "$sum":{
               "$cond":[
                  {
                     $and:[
                        {
                           "$gt":[
                              "$laps",
                              (1000 *60 * 60 * 24*2)
                           ]
                        },
                        {
                           "$lte":[
                              "$laps",
                              (1000 *60 * 60 * 24*7)
                           ]
                        },

                     ]
                  },
                  1,
                  0
               ]
            }
         },
         "8_30days":{
            "$sum":{
               "$cond":[
                  {
                     $and:[
                        {
                           "$gt":[
                              "$laps",
                              (1000 *60 * 60 * 24*8)
                           ]
                        },
                        {
                           "$lte":[
                              "$laps",
                              (1000 *60 * 60 * 24*30)
                           ]
                        },

                     ]
                  },
                  1,
                  0
               ]
            }
         },
         "30+days":{
            "$sum":{
               "$cond":[
                  {
                     "$gte":[
                        "$laps",
                        (1000 *60 * 60 * 24*30)
                     ]
                  },
                  1,
                  0
               ]
            }
         }
      }
   }
])

它会返回这样的东西:

{
   "_id":null,
   "1_day":1,
   "2_7days":3,
   "8_30days":0,
   "30+days":0
}

您可能需要调整边界以更好地满足您的需求

在线试用:mongoplayground.net/p/JqolUAp2lfk