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 || Снижает!!

Другие вопросы по тегам