0
我正在爲幾乎實時的統計模塊創建數據庫結構。我想統計不同產品的用戶行爲:新的喜歡,投票,新評論和總活動(總票數,喜歡等)。MongoDB中重疊日期的聚合查詢
該模塊需要在過去的8,16或24小時內發送最多的活動的 N產品。 我的第一個想法是爲一個文件下面的模式:
{
"_id" : ObjectId("570e37d0db8c0897d651509c"),
"date" : "2016-04-13",
"trackId" : 35,
"count" : {
"hour_1" : {
"total" : 120,
"downVote" : 35,
"newComment" : 26,
"upVote" : 34,
"like" : 25
},
"hour_2" : {
"total" : 124,
"downVote" : 32,
"like" : 28,
"upVote" : 33,
"newComment" : 31
},
// ...
"hour_24" : {
"total" : 119,
"downVote" : 42,
"newComment" : 30,
"upVote" : 31,
"like" : 16
}
}
}
在這種情況下,我有X產品X文件在一天與此查詢我什麼,我需要快速維伊獲取數據。
db.getCollection('HourlyStat')
.aggregate([
{$match: {date: '2016-04-13'}},
{
$project: {'trackId': "$trackId",
count: {
$sum: ["$count.hour_1.total", "$count.hour_2.total", ..., "$count.hour_8.total"] }
}
},
{$sort: {'count': -1}}, {$limit: 10}
])
不幸的是,這是不適用於包括兩天的時間段。 例如:從2016-04-13 12:00:00
到2016-04-14 12:00:00
我可以爲此編寫一個查詢,或者我應該更改我的數據結構嗎?一個簡單的解決方法是將小時數據存儲在獨立的文檔中,但它將包含多達24倍的數據,而對於大量的產品,它可能會很慢。
好了,你就需要爲每個時隙運行多個聚集查詢,並在應用程序中合併返回文檔的情況下。 – Saleem
@Saleem這不是一個可以接受的解決方案,因爲在這種情況下,應用程序服務器需要處理大量的數據,消耗內存。 – Festo