2

MongoDB と 10Gen node.js ドライバーを使用しています。

MongoDB にコレクションがあり、次のようなドキュメントがあります。

{
 _id: ObjectId( "500310affdc47af710000001" ),
 name:'something',
 tags:['apple','fruit','red'],
 created: Date( 1342378221351 )
}

私が取得したいのは、すべてのドキュメントを見て、コレクション内のすべてのドキュメントのすべてのタグの個別の数を取得することです。グループ機能を試してみたところ、次のようになりました。

> db.photos.group(
... {cond:{}
... ,key:{tags:true}
... ,initial:{count:0}
... ,reduce:function(doc,out){out.count++}
... ,finalize:function(out){}});
[
    {
        "tags" : null,
        "count" : 35
    },
    {
        "tags" : [
            "#strawberry",
            "#friutpicture"
        ],
        "count" : 1
    }
]

これは正しくありません。次のように、カウントなしで明確に取得できます。

> db.photos.distinct('tags')
[
    "#friutpicture",
    "#strawberry",
    "#factory",
    "#wallpaper",
    "#bummber",
    "#test",
    "#fire",
    "#watermark"
]

しかし、私はカウントが必要です。

4

1 に答える 1

5

新しい Aggregation Framework (2.1+) では以下を使用できます。

> db.photos..aggregate([{$unwind:"$tags"},
                        {$group:{_id:"$tags"}},
                        {$group:{_id:"DistictCount",count:{$sum:1}}}])

結果は次のようになります。

{
    "result" : [
        {
            "_id" : "DistictCount",
            "count" : 8
        }
    ],
    "ok" : 1
}

グループ化する前にタグ配列を「展開」する必要があるため、グループ関数は必要なことを行いません。つまり、ドキュメント内の各タグを発行するマップ関数と削減が必要です。2.0 以前で行き詰まっていて集約フレームワークを使用できない場合は、map/reduce を使用できます。これが役立つ例です。

于 2012-07-15T20:26:40.103 に答える