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,我会在每个艺术家中得到专辑: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 回答