MapReduce og gøre det på klientsiden vil være for langsomt - du bør bruge aggregeringsrammerne (nyt i MongoDB 2.2).
Det kan se sådan ud:
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 }
])
Bemærk, at det første og tredje rørledningselement ser identiske ud, dette er bevidst og nødvendigt. Her er, hvad trinnene gør:
- giv kun dokumenter videre, som har tagget "bar" eller "hej" i sig.
- slap tags-arrayet ud (hvilket betyder opdelt i et dokument pr. tags-element
- giv kun tags med præcis "bar" eller "hej" (dvs. kasser resten af tags)
- grupper efter titel (det kan også være efter "$_id" eller en hvilken som helst anden kombination af originalt dokument, der lægger op til, hvor mange tags (af "bar" og "hej") den havde
- sortér i faldende rækkefølge efter antal relevante tags
- (valgfrit) begrænse det returnerede sæt til top 10.