Mongodb MongDB MapReduce之后的筛选结果集

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",

考虑以下MongoDB集合/原型,它跟踪给定人员在给定时间点拥有多少cookie:

{
  "_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
      }
    }
  ],
  ...