[英]Mongodb mapreduce optimization
我有一個使用此模式存儲在Mongodb上的命中集合:{userid:... date:...}
我想顯示一個報告,計算兩個日期之間的唯一訪問者(具有不同用戶ID的訪問者在這些日期之間進行了點擊)。
輸出示例:
訪客人數:...點擊次數:...
該集合的大小約為1M記錄。
我的第一個想法是使用增量mapreduce來計算白天的聚合值。 然后在輸出最終結果的日子里進行第二次mapreduce。
問題是當在報告上選擇一系列日期時,我無法計算正確數量的唯一身份訪問者。
白天匯總值的示例:第1天:1個唯一身份訪問者第2天:2位唯一身份訪問者(2位訪客中有1位在第1天受到影響)
這兩天的獨立訪客總數為3,但整個時期只有2位獨立訪客,而不是3位。
您是否有任何高效的方法來計算此示例中的唯一身份訪問者?
通過在所需日期使用單個map-reduce可能更容易解決此問題。 您可以在要檢查的所有日期執行相同的聚合,而不是首先聚合一天中的唯一身份用戶(您的第一步)。 通過這種方式,您可以完全避免第二步。
要將其分解為Map和Reduce部分:
映射:查找在所需時間范圍內記錄的所有用戶ID
Reduce:刪除所有重復的用戶ID
完成此過程后,您應該留下該時間范圍內的唯一訪問者集(更具體地說,唯一的用戶ID)。
或者,有一種更簡單的方法可以完全不需要map-reduce。 “distinct”命令(請參閱mongoDB distinct文檔 )允許您選擇一個字段並返回一個僅填充該字段的不同(唯一)值的數組。 如果在所需時間范圍內對文檔使用了distinct命令,則可以獲得包含該時間段內所有用戶ID的數組,而不會出現任何重復項。
希望這可以幫助!
您可以使用2.2版及其聚合框架輕松完成此操作。
假設schema {userid:“”,date:“”}並給出兩個特定日期d1和d2,這就是管道:
db.collection.aggregate(
[
{
"$match" : {
"date" : {
"$gte" : d1,
"$lte" : d2
}
}
},
{
"$group" : {
"_id" : "$userid",
"hits" : {
"$sum" : 1
}
}
},
{
"$group" : {
"_id" : "1",
"visitors" : {
"$sum" : 1
},
"hits" : {
"$sum" : "$hits"
}
}
},
{
"$project" : {
"_id" : 0,
"visitors" : 1,
"hits" : 1
}
}
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.