我有一系列歌曲及其元数据,结构如下:
[{
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,因为它需要数字而不是字符串。
我无法绕过它!
答案 0 :(得分: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 } }
]
)