MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Grupo MongoDB por elementos internos do array


Qual estrutura você está usando? Este não é o shell do MongoDB e parece um wrapper estranho em torno do MapReduce. Nesse caso, $unwind não estaria disponível e você precisa dele para o usuário na estrutura de agregação. Aqui está o que você quer no shell do mongo:
db.articles.aggregate([
  {$match: { class_date: { $gte: date } } },
  {$project: { _id: 0, class_artist: 1 } },
  {$unwind: "$class_artist" },
  {$group: { _id: "$class_artist", tags: { $sum: 1 } }},
  {$project: { _id: 0,class_artist: "$_id", tags: 1 } },
  {$sort: { tags: -1 } }
])

Tão eficientemente:
  1. Filtrar por data porque você já definiu um var nos últimos sete dias
  2. Projete apenas o(s) campo(s) de que precisamos { Precisamos de apenas um! }
  3. Desenrole o array para que agora tenhamos um registro para cada elemento do array em cada documento
  4. Grupo no Artista dos documentos expandidos
  5. Projete em um formato de documento que você pode usar como grupo que mexeu com _id
  6. Ordene os resultados na ordem inversa para ver os primeiros marcados primeiro

E o melhor da agregação é que você pode construir gradualmente esses estágios para ver o que está acontecendo.

Agite e asse em sua própria implementação de driver ou estrutura ODM, conforme necessário.