MapReduce et le faire côté client vont être trop lents - vous devez utiliser le framework d'agrégation (nouveau dans MongoDB 2.2).
Cela pourrait ressembler à ceci :
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 }
])
Notez que les premier et troisième membres du pipeline semblent identiques, c'est intentionnel et nécessaire. Voici ce que font les étapes :
- ne transmettre que les documents contenant la balise "bar" ou "hello".
- dérouler le tableau de balises (c'est-à-dire diviser en un document par élément de balises
- transmettre uniquement les balises exactement "bar" ou "hello" (c'est-à-dire supprimer le reste des balises)
- regrouper par titre (il peut également s'agir de "$_id" ou de toute autre combinaison de document original en additionnant le nombre de balises (de "bar" et "hello") qu'il avait
- trier par ordre décroissant du nombre de balises pertinentes
- (facultatif) limiter l'ensemble renvoyé aux 10 premiers.