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

Sortieren nach Relevanz mit MongoDB

MapReduce und die Client-seitige Ausführung werden zu langsam sein – Sie sollten das Aggregations-Framework verwenden (neu in MongoDB 2.2).

Es könnte etwa so aussehen:

db.collection.aggregate([
   { $match : { "tags": { "$in": ["bar", "hello"] } } },
   { $unwind : "$tags" },
   { $match : { "tags": { "$in": ["bar", "hello"] } } },
   { $group : { _id: "$title", numRelTags: { $sum:1 } } },
   { $sort : { numRelTags : -1 } }
   //  optionally
   , { $limit : 10 }
])

Beachten Sie, dass das erste und dritte Pipeline-Mitglied identisch aussehen, dies ist beabsichtigt und erforderlich. Folgendes bewirken die Schritte:

  1. Nur Dokumente weitergeben, die das Stichwort "bar" oder "hello" enthalten.
  2. Entfernen Sie das Tags-Array (was bedeutet, dass es in ein Dokument pro Tag-Element aufgeteilt wird
  3. Nur Tags weitergeben, die genau "bar" oder "hello" sind (d. h. die restlichen Tags verwerfen)
  4. nach Titel gruppieren (es könnte auch nach "$_id" oder einer anderen Kombination des Originaldokuments sein, die zusammenzählt, wie viele Tags (von "bar" und "hello") es hatte
  5. in absteigender Reihenfolge nach Anzahl relevanter Tags sortieren
  6. Beschränken Sie (optional) den zurückgegebenen Satz auf die Top 10.