MapReduce a jeho provádění na straně klienta bude příliš pomalé – měli byste použít agregační rámec (nový v MongoDB 2.2).
Mohlo by to vypadat nějak takto:
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 }
])
Všimněte si, že první a třetí člen potrubí vypadají identicky, je to záměrné a potřebné. Postup je následující:
- předávat pouze dokumenty, které obsahují značku „bar“ nebo „ahoj“.
- rozbalte pole značek (to znamená rozdělení do jednoho dokumentu na prvek značek
- předat pouze značky přesně „bar“ nebo „hello“ (tj. zbytek značek zahoďte)
- seskupit podle názvu (může to být také podle „$_id“ nebo jakékoli jiné kombinace původního dokumentu s uvedením počtu značek (z „bar“ a „hello“), které měl
- řazení v sestupném pořadí podle počtu relevantních značek
- (volitelně) omezte vrácenou sadu na 10 nejlepších.