MapReduce e farlo lato client sarà troppo lento:dovresti usare il framework di aggregazione (nuovo in MongoDB 2.2).
Potrebbe assomigliare a questo:
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 }
])
Nota che il primo e il terzo membro della pipeline sembrano identici, questo è intenzionale e necessario. Ecco cosa fanno i passaggi:
- trasmetti solo i documenti che contengono il tag "bar" o "hello".
- svolgere l'array di tag (che significa dividere in un documento per elemento di tag
- passa solo i tag esattamente "bar" o "hello" (cioè scarta il resto dei tag)
- raggruppa per titolo (potrebbe anche essere "$_id" o qualsiasi altra combinazione di documento originale sommando quanti tag (di "bar" e "hello") aveva
- ordina in ordine decrescente per numero di tag rilevanti
- (facoltativamente) limita il set restituito ai primi 10.