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 の開発バージョン) を使用できる場合は、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 の各インスタンスが 1 つの例だと思いますよね?)、最後に再度プロジェクションを使用してフィールドのラベルを変更し、結果を次のようにします。

"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 に答える