映射reduce以计数唯一计数



我想要一个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]
}]

条件是:

  1. 仅选择哪个具有索引的数组具有CCD_ 1。这可以作为查询即,查询:{索引:{$in:2}}
  2. b分组
  3. 如果存在重复的a,则应将其视为1,例如:具有a=2的文档存在于满足条件索引的两次中具有2
  4. 我的输入集合总是满足如果如果在"测试"中出现,则不会出现在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" : 3 -> It should be 2
    }
},{
    "_id" : apple",
    "value" : {
        "count" : 2
    }
},{
    "_id" : dummy",
    "value" : {
        "count" : 4 -> It should be 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 }

相关内容

  • 没有找到相关文章

最新更新