MapReduce en het aan de clientzijde doen zal te traag zijn - u moet het aggregatieraamwerk gebruiken (nieuw in MongoDB 2.2).
Het kan er ongeveer zo uitzien:
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 }
])
Merk op dat de eerste en derde pijplijnleden er identiek uitzien, dit is opzettelijk en nodig. Dit is wat de stappen doen:
- geef alleen documenten door die de tag "bar" of "hallo" bevatten.
- ontspan de tags-array (wat betekent opgesplitst in één document per tags-element
- alleen tags doorgeven die exact "bar" of "hallo" zijn (d.w.z. de rest van de tags weggooien)
- groeperen op titel (het kan ook op "$_id" of een andere combinatie van origineel document zijn, waarbij wordt opgeteld hoeveel tags (van "bar" en "hallo") het had
- sorteer in aflopende volgorde op aantal relevante tags
- (optioneel) beperk de geretourneerde set tot top 10.