MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB gruppiert nach Array-inneren Elementen

Welchen Rahmen verwendest du? Dies ist keine MongoDB-Shell und sieht aus wie ein seltsamer Wrapper um MapReduce. In diesem Fall wäre $unwind nicht verfügbar und Sie benötigen es für Benutzer im Aggregationsframework. Folgendes möchten Sie in der 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 } }
])

So effizient:

  1. Nach Datum filtern, da Sie bereits eine Variable für die letzten 7 Tage festgelegt haben
  2. Projizieren Sie nur die Felder, die wir brauchen { Wir brauchen nur eins! }
  3. Entfernen Sie das Array, sodass wir jetzt einen Datensatz für jedes Array-Element in jedem Dokument haben
  4. Gruppieren Sie den Künstler aus den erweiterten Dokumenten
  5. Projizieren Sie in ein Dokumentformat, das Sie als Gruppe verwenden können, die mit _id herumspielt
  6. Sortieren Sie die Ergebnisse in umgekehrter Reihenfolge, um die Top-Tags zuerst zu sehen

Und das Tolle an der Aggregation ist, dass Sie diese Phasen schrittweise aufbauen können, um zu sehen, was vor sich geht.

Schütteln und backen Sie nach Bedarf in Ihre eigene Treiberimplementierung oder Ihr ODM-Framework.