MapReduce и правенето му от страна на клиента ще бъде твърде бавно - трябва да използвате рамката за агрегиране (ново в MongoDB 2.2).
Може да изглежда така:
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 }
])
Обърнете внимание, че първият и третият член на тръбопровода изглеждат идентични, това е умишлено и е необходимо. Ето какво правят стъпките:
- предавайте само документи, които имат маркер "лента" или "здравей" в тях.
- развиване на масива от етикети (което означава разделяне на един документ на елемент от етикети
- предавайте само тагове точно "bar" или "hello" (т.е. изхвърлете останалите тагове)
- групиране по заглавие (може да бъде и по „$_id“ или всяка друга комбинация от оригинален документ, добавяйки колко етикета (от „bar“ и „hello“) има
- сортирайте в низходящ ред по брой подходящи тагове
- (по желание) ограничете върнатия набор до топ 10.