sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB grupperar efter array inre-element

Vilket ramverk använder du? Det här är inte MongoDB-skal och ser ut som något konstigt omslag runt MapReduce. I så fall skulle $unwind inte vara tillgängligt, och du behöver det för användare i aggregeringsramverket. Här är vad du vill ha i mongoskalet:

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

Så effektivt:

  1. Filtrera efter datum eftersom du redan har ställt in en var för de senaste 7 dagarna
  2. Projektera endast fälten vi behöver { We need only one! }
  3. Koppla av arrayen så att vi nu har en post för varje arrayelement i varje dokument
  4. Gruppera på artisten från de utökade dokumenten
  5. Projektera i ett dokumentformat som du kan använda som en grupp som rörs runt med _id
  6. Sortera resultaten i omvänd ordning för att se toppen taggade först

Och det fina med aggregering är att du gradvis kan bygga upp dessa stadier för att se vad som händer.

Skaka och baka in i din egen drivrutinimplementering eller ODM-ramverk efter behov.




  1. Skapa flerfältsindex i Mongoose / MongoDB

  2. Mongo Change Streams körs flera gånger (typ):Nodapp som kör flera instanser

  3. Multi-samling, multi-dokument "transaktioner" i MongoDB

  4. Varför behöver vi en "arbiter" i MongoDB-replikering?