1

我有这种格式的 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 集合中指定。

4

1 回答 1

1

如果你可以使用 2.1(即将发布的 2.2 的开发版),那么你可以使用聚合框架,它看起来像这样:

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
于 2012-06-17T07:49:51.457 回答