1

次の構造の曲とそのメタデータのコレクションがあります。

[{
    title:"title",
    artist:"artist",
    album:"album,
    ...
},...

ここで、Node.jsを使用して、曲数とアルバム数を含むすべてのアーティストのリストを取得したいと思います。これまでのところ、集約フレームワークを使用して、次のパイプラインを使用して、各アーティストのオブジェクトの配列、その曲の数、およびアルバムのタイトルの配列(カウントだけでなく)を取得できました。

collection.aggregate([
            { $project:{
                artist:1,
                album:1
            }},
            { $group: {
                _id: "$artist",
                songs:{$sum: 1},
                albums:{$addToSet:"$album"}
            }},
            { $sort: { artist: 1 } }
        ]

に置き換える$addToSet$sum、すべてのアーティストでalbums:0になります。これは、文字列ではなく数値を合計することを想定しているためです。

私はそれを回避することはできません!

4

1 に答える 1

0

パイプラインにいくつかのステップを追加する必要があります。アルバムの配列をほどいてからカウントする必要があります。これがどのように見えるかです:

collection.aggregate([
            { $project:{
                artist:1,
                album:1
            }},
            { $group: {
                _id: "$artist",
                songs:{$sum: 1},
                albums:{$addToSet:"$album"}
            }},
            { $unwind: "$albums"},
            { $group: {
                _id: "$_id",
                songs:{$first: 1},
                albums:{$sum: 1}
            }},
            { $sort: { artist: 1 } }
        ]
)
于 2013-03-17T17:49:25.073 に答える