MapReduce dan melakukannya di sisi klien akan menjadi terlalu lambat - Anda harus menggunakan kerangka kerja agregasi (baru di MongoDB 2.2).
Mungkin terlihat seperti ini:
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 }
])
Perhatikan anggota pipa pertama dan ketiga terlihat identik, ini disengaja dan diperlukan. Berikut langkah-langkahnya:
- teruskan hanya dokumen yang memiliki tag "bar" atau "halo" di dalamnya.
- melepas larik tag (artinya dipecah menjadi satu dokumen per elemen tag
- hanya meneruskan tag dengan tepat "bar" atau "halo" (yaitu membuang sisa tag)
- kelompokkan menurut judul (bisa juga dengan "$_id" atau kombinasi lain dari dokumen asli menambahkan berapa banyak tag (dari "bar" dan "halo") yang dimilikinya
- urutkan dalam urutan menurun menurut jumlah tag yang relevan
- (opsional) batasi set yang dikembalikan ke 10 teratas.