2016-11-30 7 views
0

mongoDbを使用して最後の2つのエントリの日数をグループ化した日数を日数で取得したいとします。mongodbで2つのエントリの間の日数を取得する

 

------------------------------------------------- 
| 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アドレスの最後の2つの日付の間には入れません。 – Yoleth

+0

@Yoleth私の編集を参照してください – felix

+0

それは完璧です、ありがとう! – Yoleth

関連する問題