Рассмотрим следующую коллекцию / прототип 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 для решения этой проблемы?Фактическая рабочая нагрузка за этим сценарием будет включать в себя миллионы строк.
Заранее спасибо