MongoDb - mapReduce(...) не работает
Образец документа:
{
"_id" : ObjectId("51cd7274267d959cb9f95cea"),
"creation_time" : 100,
"delivered" : true,
"id" : 1,
"user_id" : 10
}
Функция карты:
db.system.js.save({
_id: "mapDummy",
value: function(){
emit(this.user_id,this.user_id);
}
});
Уменьшить функцию:
db.system.js.save({
_id: "reduceDummy",
value: function(key,values){
return Array.sum(values);
}
});
Вызов функции mapReduce(...):
db.newsdb.mapReduce("mapDummy", "reduceDummy", {out: "notifications_result", query: {delivered:true}});
{
"result" : "notifications_result",
"timeMillis" : 16,
"counts" : {
"input" : 12,
"emit" : 0,
"reduce" : 0,
"output" : 0
},
"ok" : 1,
}
Зачем emit:0
?
1 ответ
Решение
Я думаю, это потому, что вы используете строку, а не функцию для вызова:
db.newsdb.mapReduce("mapDummy", "reduceDummy", {out: "notifications_result", query: {delivered:true}});
Вместо Map/Reduce я бы предложил вам использовать структуру агрегации (A/F) в любом случае. Похоже, вы делаете простую группу с помощью user_id, которая лучше подходит для A / F, так как она намного быстрее и проще в использовании:
db.newsdb.aggregate( { $group: { _id: user_id, count: { $sum: 1 } } } );
После часа неудачных попыток...!
let maps = function() {
emit(this. user_id, 1)
};
let reduces = function(keys, vals){
return Array.sum(vals);
};
result.collection.mapReduce(maps, reduces, { out: { reduce: 'test_collection'
}, jsMode: true, verbose: true})
.then(res=> console.log(res.stats))
.catch(err=> console.log({err}));
..Я установил, что 'mapReduce' не принимает 'Fat Arrows' =>=>=>=>|_ Maps || Снижает!!