2016-04-11 22 views
0

Ben önceden biriktirilmiş olan raporlar, bkz: https://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/#one-document-per-page-per-dayMongoDB, raporları birden çok gün içinde zaman dilimleri için toplamak için nasıl kullanılır? mongodb docs aşağıdaki

{ 
    _id: "20101010/site-1/apache_pb.gif", 
    metadata: { 
     date: ISODate("2000-10-10T00:00:00Z"), 
     site: "site-1", 
     page: "/apache_pb.gif" }, 
    daily: 5468426, 
    hourly: { 
     "0": 227850, 
     "1": 210231, 
     ... 
     "23": 20457 }, 
    minute: { 
     "0": 3612, 
     "1": 3241, 
     ... 
     "1439": 2819 } 
} 

böyle geri x günlerce görüşlerini bir araya toplar:

db.collection.aggregate(
{ $match : { date: { $gte : ISODate("2016-04-07T00:00:00.000Z")}}}, 
{ $group: {_id: "_id", views: {$sum: "$daily"}}}, 
{ $sort: {views: -1}}  

)

Şimdi istediğim Son x saatin görüşleri. Sorun burada tarih satırı. Aynı gün içinde olduğum sürece çözümüm gayet iyi çalışıyor, ama tarih çizgisini en iyi şekilde nasıl geçiyor? İşte

ben ne var: Bazı araştırmadan sonra

db.collection.aggregate(
{ $match : { date: { $eq : ISODate("2016-04-07T00:00:00.000Z")}}}, 
{ $group: {_id: "$_id", views: { $sum: { $add: [ '$hourly.1', '$hourly.2', ... ] }} }}, 
{ $sort: {views: -1}}  

cevap

0

, burada benim cevap:

db.collection.aggregate([ 
{ $match : { date : { $gte : ISODate("2016-04-20T00:00:00.000Z")}}}, 
{ $project : { 
       _id: "$_id",  
       views : 
       { 
       $cond : [ 
        { $eq : [ "$date", ISODate("2016-04-20T00:00:00.000Z") ] }, 
         { $add: [ { $ifNull : ['$hourly.22' , 0 ] } , { $ifNull : ['$hourly.23' , 0 ] } ] }, 
         { $add: [ { $ifNull : ['$hourly.0' , 0 ] } , { $ifNull : ['$hourly.1' , 0 ] } ] }, 
        ] 
       } 
      } 
}, 
{ $group: { "_id" : "$_id", views: { $sum: { $add: [ "$views" ] } } }}, 
{ $sort: { views: -1}} 
]) 

$ cond niteliği benim için hile yaptı, bu yüzden farklı bir tarih ayırt olabilir veri kümeleri.