MapReduce och att göra det på klientsidan kommer att gå för långsamt - du bör använda aggregeringsramverket (nytt i MongoDB 2.2).
Det kan se ut ungefär så här:
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 }
])
Observera att de första och tredje rörledningsmedlemmarna ser identiska ut, detta är avsiktligt och nödvändigt. Så här gör stegen:
- lämna endast dokument som har taggen "bar" eller "hej" i sig.
- linda upp taggarrayen (vilket betyder uppdelad i ett dokument per taggelement
- sänd bara taggar exakt "bar" eller "hej" (dvs. kassera resten av taggarna)
- gruppera efter titel (det kan också vara efter "$_id" eller någon annan kombination av originaldokument som lägger till hur många taggar (av "bar" och "hej") den hade
- sortera i fallande ordning efter antal relevanta taggar
- (valfritt) begränsa den returnerade uppsättningen till topp 10.