2016-11-30 123 views
0

我希望获得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

请添加您到目前为止尝试过的任何内容 – Veeram

回答

1

你可以像这样

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 
} 

,你可能需要调整范围,以便更好地满足您的需求

+0

这几乎就是这样,但我不想从现在开始的天数,而是在同一个mac地址的最后两个日期之间。 – Yoleth

+0

@Yoleth看到我的编辑 – felix

+0

这很完美,非常感谢! – Yoleth

相关问题