2016-11-30 127 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

相關問題