Mongodb 映射reduce以计数唯一计数

Mongodb 映射reduce以计数唯一计数,mongodb,mapreduce,mongodb-query,aggregation-framework,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,我想要一个map reduce函数从满足以下条件的以下输入集合中绘制以下输出 输入收集: [{ a:1, b:'test', indices:[1,2,4,5] }, { a:2, b:'test', indices:[2, 3, 5] }, { a:2, b:'test', indices:[1, 2, 4] }, { a:3, b:'apple', indices:[1, 2] }, {

我想要一个map reduce函数从满足以下条件的以下输入集合中绘制以下输出

输入收集:

[{

    a:1,
    b:'test',
    indices:[1,2,4,5]
}, {
    a:2,
    b:'test',
    indices:[2, 3, 5]
}, {
    a:2,
    b:'test',
    indices:[1, 2, 4]
}, {
    a:3,
    b:'apple',
    indices:[1, 2]
}, {
    a:4,
    b:'apple',
    indices:[1, 3, 5]
}, {
    a:5,
    b:'orange',
    indices:[232]
}, {
    a:5,
    b:'dummy',
    indices:[2]
}, {
    a:6,
    b:'dummy',
    indices:[11, 2, 4]
}, {
    a:6,
    b:'dummy',
    indices:[11, 3, 2]
}, {
    a:6,
    b:'dummy',
    indices:[1, 2, 3, 4, 5]
}]
条件是:

  • 仅选择具有索引的数组具有
    2
    。这可以通过电子邮件发送 查询i、 查询:{index:{$in:2}}
  • 分组依据
    b
  • 如果存在重复的
    a
    ,则应将其视为
    1
    例如:a=2的文档在满足条件索引的两次中出现 有两个
  • 我的输入集合始终满足以下条件:如果 prents在“test”中,它不会出现在
    dummy/apple/etc
    中。但是 可以复制
  • 以下是我尝试过的:

    db.x.mapReduce(function(){
            emit(this.b, 1);
        }, function(key, reducable){
            return Array.sum(reducable);
        }, {
        out: {inline: 1},
        query:{
            'indices':{$in:2}
        }
        });
    
    输出: [

    预期产出:

    [{
        "_id" : test",
        "value" : {
            "count" : 2
        }
    },{
        "_id" : apple",
        "value" : {
            "count" : 2
        }
    },{
        "_id" : dummy",
        "value" : {
            "count" : 2
        }
    }]
    

    无需映射/减少。使用聚合:

    > db.crawler_status.aggregate([
        { "$match" : { "indices" : 2 } },
        { "$group" : { "_id" : { "b" : "$b", "a" : "$a" } } },
        { "$group" : { "_id" : "$_id.b", "count" : { "$sum" : 1 } } }
    ])
    { "_id" : "test", "count" : 2 }
    { "_id" : "apple", "count" : 1 }    // your sample output was mistaken
    { "_id" : "dummy", "count" : 2 }
    
    > db.crawler_status.aggregate([
        { "$match" : { "indices" : 2 } },
        { "$group" : { "_id" : { "b" : "$b", "a" : "$a" } } },
        { "$group" : { "_id" : "$_id.b", "count" : { "$sum" : 1 } } }
    ])
    { "_id" : "test", "count" : 2 }
    { "_id" : "apple", "count" : 1 }    // your sample output was mistaken
    { "_id" : "dummy", "count" : 2 }