我有MongoDB中的集合與樣品DOC如下 -計算唯一使用的Redis和MongoDB(HyperLogLog)
{
"_id" : ObjectId("58114e5e43d6420b7db4e15c"),
"browser" : "Chrome",
"name": "hyades",
"country" : "in",
"day" : "16-10-21",
"ip" : "0.0.0.0",
"class" : "A123"
}
問題陳述
我應該能夠組上的任何的字段,同時獲取不同數量的IP。
聚集查詢 -
[
{$group: {_id: '$class', ip_arr: {$addToSet: '$ip'}}},
{$project: {class: '$_id.class', ip: {$size: '$ip_arr'}}}
]
給出了預期的效果,但速度很慢。同樣,使用另一個$group
計算ip
的速度很慢。輸出是 -
[{class: "A123",ip: 42},{class: "B123", ip: 56}..]
我試過
我認爲使用Hyperloglog了這一點。我嘗試使用Redis實現。我試圖流式傳輸整個數據,只是把我分組的東西,然後PFADD
它放到redis中相應的hyperloglog結構中。
邏輯看起來像 -
var stream = Model.find({}, {ip: 1, class: 1}).stream();
stream.on('data', function (doc) {
var hash = "HLL/" + doc.class;
client.pfadd(hash, doc.ip);
});
我試圖爲一百萬加數據點運行此。要流式傳輸的數據大小大約爲1GB,Mongo和Node服務器之間的連接速度爲1 Gbps。我曾預計這段代碼運行得足夠快。但是,它非常慢(比在MongoDB中計數慢)。
我認爲但沒有實現的另一件事是爲每個類預先創建桶,並在數據流入時實時增加它們。但是支持任意分組所需的內存是巨大的,因此不得不放棄理念。
請建議我可能是做錯了,或者有什麼讓我能夠充分利用hyperloglog的(我不是在Redis的限制,並開放給任何實現)
這個系列的索引是什麼? – dyouberg
你的問題必須理解,標題誤導。 – styvane
@dyouberg索引是在一天,名稱,班級,如果它很重要。 – hyades