2017-01-10 91 views
0

獲取的平均數值,我有以下集合:一段時間

{ 
     "_id" : ObjectId("58503934034b512b419a6eab"), 
     "website" : "https://www.google.com", 
     "name" : "Google", 
     "keywords" : [ 
      "Search", 
      "Websites", 
     ], 
     "tracking" : [ 
      { 
       "_id" : ObjectId("5874aa1df63258286528598d"), 
       "position" : 0, 
       "created_at" : ISODate("2017-01-1T09:32:13.831Z"), 
       "real_url" : "https://www.google.com", 
       "keyword" : "Search" 
      }, 
      { 
       "_id" : ObjectId("5874aa1ff63258286528598e"), 
       "keyword" : "Page", 
       "real_url" : "https://www.google.com", 
       "created_at" : ISODate("2017-01-1T09:32:15.832Z"), 
       "found_url" : "https://google.com/", 
       "position" : 3 
      }, 
      { 
       "_id" : ObjectId("5874aa21f63258286528598f"), 
       "keyword" : "Search", 
       "real_url" : "https://www.foamymedia.com", 
       "created_at" : ISODate("2017-01-2T09:32:17.017Z"), 
       "found_url" : "https://google.com/", 
       "position" : 2 
      }, 

      { 
       "_id" : ObjectId("5874aa21f63258286528532f"), 
       "keyword" : "Search", 
       "real_url" : "https://www.google.com", 
       "created_at" : ISODate("2017-01-2T09:32:17.017Z"), 
       "found_url" : "https://google.com/", 
       "position" : 1 
      },  
     ] 
    } 

我想要做的是組中的所有關鍵字一起計算平均的那一天,在一定時期內。

因此,讓我們說,例如:

間:2017年1月1日至2017年1月31日以下關鍵字被追蹤:

2017-01-01: 
    'Seach' => 1, 
    'Page' => 3, 
Average = 2 

2017-01-02: 
    'Search' => 4, 
    'Page' => 6, 
Average = 5 

.... 

所以,最後的結果,我就完了(在這種情況下):

{ 
    "_id" : ObjectId("5874dccb9cd90425e41b7c54"), 
    "website" : "www.google.com", 
    "averages" : [ 
     "2", 
     "5" 

    ] 
} 

回答

1

你可以嘗試這樣的事情。

$unwind跟蹤陣列後跟$sorttracking.keywordtracking.created_at$groupday獲得所有類別的平均值。最終$group將全天的平均值推入網站陣列。

db.website.aggregate([{ 
    $match: { 
     "_id": ObjectId("58503934034b512b419a6eab") 
    } 
}, { 
    $lookup: { 
     from: "seo_tracking", 
     localField: "website", 
     foreignField: "real_url", 
     as: "tracking" 
    } 
}, { 
    $unwind: "$tracking" 
}, { 
    $sort: { 
     "tracking.keyword": 1, 
     "tracking.created_at": -1 
    } 
}, { 
    $group: { 
     _id: { 
      $dayOfMonth: "$tracking.created_at" 
     }, 
     "website": { 
      $first: "$website" 
     }, 
     "website_id": { 
      $first: "$_id" 
     }, 
     "averageByDay": { 
      $avg: "$tracking.position" 
     } 
    } 
}, { 
    $group: { 
     "_id": "$website_id", 
     "website": { 
      $first: "$website" 
     }, 
     "average": { 
      $push: "$averageByDay" 
     } 
    } 
}]);