簡體   English   中英

Mongodb mapreduce優化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM