Mongodb MongDB MapReduce之后的筛选结果集
考虑以下MongoDB集合/原型,它跟踪给定人员在给定时间点拥有多少cookie:Mongodb MongDB MapReduce之后的筛选结果集,mongodb,mapreduce,mongodb-query,Mongodb,Mapreduce,Mongodb Query,考虑以下MongoDB集合/原型,它跟踪给定人员在给定时间点拥有多少cookie: { "_id": ObjectId("5c5b5c1865e463c5b6a5b748"), "person": "Drew", "cookies": 1, "timestamp": ISODate("2019-02-05T20:34:48.922Z") } { "_id": ObjectId("5c5b5c2265e463c5b6a5b749"), "person": "Max",
{
"_id": ObjectId("5c5b5c1865e463c5b6a5b748"),
"person": "Drew",
"cookies": 1,
"timestamp": ISODate("2019-02-05T20:34:48.922Z")
}
{
"_id": ObjectId("5c5b5c2265e463c5b6a5b749"),
"person": "Max",
"cookies": 3,
"timestamp": ISODate("2019-02-06T20:34:48.922Z")
}
{
"_id": ObjectId("5c5b5c2e65e463c5b6a5b74a"),
"person": "Max",
"cookies": 0,
"timestamp": ISODate("2019-02-07T20:34:48.922Z")
}
最终,我需要让所有当前拥有超过0个cookie的人都参与进来——在上面的示例中,只有“Drew”才有资格参与进来——“Max”有3个cookie,但后来只有0个cookie)
为了解决这个问题,我编写了以下map/reduce函数
var map = function(){
emit(this.person, {'timestamp' : this.timestamp, 'cookies': this.cookies})
}
var reduce = function(person, cookies){
let latestCookie = cookies.sort(function(a,b){
if(a.timestamp > b.timestamp){
return -1;
} else if(a.timestamp < b.timestamp){
return 1
} else {
return 0;
}
})[0];
return {
'timestamp' : latestCookie.timestamp,
'cookies' : latestCookie.cookies
};
}
Max被包括在结果中,但我不希望他被包括在内(毕竟他没有饼干)
我的选择是什么?我对MongoDB还是比较陌生的。我已经看过了finalize
以及创建临时集合({out:“temp.cookies”}
),但我只是好奇是否有一个更简单的选项或参数我忽略了
我是否疯狂地使用MapReduce来解决这个问题?此场景背后的实际工作负载将包括数百万行
提前感谢好吧,我不确定,如果你能存储cookie的更新值,如果你能,那么它将更容易和快速。好吧,我不确定,如果你能存储cookie的更新值,如果你能,那么它将更容易和快速。
db.cookies.mapReduce(map, reduce, {out:{inline:1}})
...
"results": [
{
"_id": "Drew",
"value": {
"timestamp": ISODate("2019-02-05T20:34:48.922Z"),
"cookies": 1
}
},
{
"_id": "Max",
"value": {
"timestamp": ISODate("2019-02-07T20:34:48.922Z"),
"cookies": 0
}
}
],
...