MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Trier par pertinence avec MongoDB

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 :

  1. ne transmettre que les documents contenant la balise "bar" ou "hello".
  2. dérouler le tableau de balises (c'est-à-dire diviser en un document par élément de balises
  3. transmettre uniquement les balises exactement "bar" ou "hello" (c'est-à-dire supprimer le reste des balises)
  4. 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
  5. trier par ordre décroissant du nombre de balises pertinentes
  6. (facultatif) limiter l'ensemble renvoyé aux 10 premiers.