Фильтр ResultSet после MongDB MapReduce - PullRequest
0 голосов
/ 07 февраля 2019

Рассмотрим следующую коллекцию / прототип 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, но позже было только 0).

Я написал следующие функции 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
    };
}

Это отлично работает, и я получаю следующий результат. Набор:

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

Макс включен в результаты - но я бы хотел, чтобы его не включили (у него есть0 куки в конце концов)

Какие у меня есть варианты?Я все еще относительно новичок в MongoDB.Я рассмотрел finalize, а также создал временную коллекцию ({out: "temp.cookies"}), но мне просто любопытно, есть ли более простой параметр или параметр, который я пропускаю.

Я с ума схожу от использования MapReduce для решения этой проблемы?Фактическая рабочая нагрузка за этим сценарием будет включать в себя миллионы строк.

Заранее спасибо

...