MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Gruppo MongoDB per elementi interni dell'array

Che struttura stai usando? Questa non è una shell MongoDB e sembra uno strano wrapper attorno a MapReduce. In tal caso $unwind non sarebbe disponibile e ne avrai bisogno per l'utente nel framework di aggregazione. Ecco cosa vuoi nella mongo shell:

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

Così efficiente:

  1. Filtra per data perché hai già impostato una var negli ultimi 7 giorni
  2. Proietta solo i campi di cui abbiamo bisogno { Ne serve solo uno! }
  3. Srotolare l'array in modo da avere ora un record per ogni elemento dell'array in ogni documento
  4. Gruppo sull'Artista dai documenti espansi
  5. Proietta in un formato di documento che puoi usare come gruppo incasinato con _id
  6. Ordina i risultati in ordine inverso per vedere prima la parte superiore contrassegnata

E il bello dell'aggregazione è che puoi costruire gradualmente quelle fasi per vedere cosa sta succedendo.

Agitare e cuocere nel proprio framework di implementazione del driver o ODM come richiesto.