mongodb中的地图缩小

时间:2012-06-17 07:26:15

标签: mongodb mapreduce

我有这种格式的mongo文件。

{"_id" : 1,"Summary" : {...},"Examples" : [{"_id" : 353,"CategoryId" : 4},{"_id" : 239,"CategoryId" : 28}, ...  ]}
{"_id" : 2,"Summary" : {...},"Examples" : [{"_id" : 312,"CategoryId" : 2},{"_id" : 121,"CategoryId" : 12}, ...  ]}

如何映射/缩小它们以获得类似的哈希:

{ [ result[categoryId] : count_of_examples , .....] }

即。每个类别的例子数。 我有30个类别,都在Categories集合中指定。

1 个答案:

答案 0 :(得分:1)

如果您可以使用2.1(即将发布的版本2.2的开发版本),那么您可以使用Aggregation Framework,它看起来像这样:

db.collection.aggregate( [
       {$project:{"CatId":"$Examples.CategoryId","_id":0}}, 
       {$unwind:"$CatId"}, 
       {$group:{_id:"$CatId","num":{$sum:1} } },  
       {$project:{CategoryId:"$_id",NumberOfExamples:"$num",_id:0  }} 
] );

第一步将Examples(CategoryId)的子字段投影到文档的顶级字段(不是必需但有助于提高可读性),然后我们展开示例数组,为CatId的每个数组值创建单独的文档,我们做一个“分组依据”并计算它们(我假设CategoryId的每个实例都是一个例子,对吗?)最后我们再次使用投影来重新标记字段并使结果看起来像这样:

"result" : [
    {
        "CategoryId" : 12,
        "NumberOfExamples" : 1
    },
    {
        "CategoryId" : 2,
        "NumberOfExamples" : 1
    },
    {
        "CategoryId" : 28,
        "NumberOfExamples" : 1
    },
    {
        "CategoryId" : 4,
        "NumberOfExamples" : 1
    }
],
"ok" : 1