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:
- Nur Dokumente weitergeben, die das Stichwort "bar" oder "hello" enthalten.
- Entfernen Sie das Tags-Array (was bedeutet, dass es in ein Dokument pro Tag-Element aufgeteilt wird
- Nur Tags weitergeben, die genau "bar" oder "hello" sind (d. h. die restlichen Tags verwerfen)
- 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
- in absteigender Reihenfolge nach Anzahl relevanter Tags sortieren
- Beschränken Sie (optional) den zurückgegebenen Satz auf die Top 10.