2013-03-17 4 views
1

У меня есть сборник песен и его метаданные со следующей структурой:Count (поле) на Монго

[{ 
    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

Вам необходимо добавить пару шагов к вашему конвейеру - массив альбомов необходимо размотать, а затем подсчитать. Вот как это будет выглядеть:

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 } } 
     ] 
) 
+0

Работает как очарование, спасибо! – manutenfruits