sql >> Base de Datos >  >> NoSQL >> MongoDB

Ordenar por relevancia con MongoDB

MapReduce y hacerlo del lado del cliente va a ser demasiado lento; debe usar el marco de agregación (nuevo en MongoDB 2.2).

Podría ser algo como esto:

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 }
])

Tenga en cuenta que los miembros de la canalización primero y tercero parecen idénticos, esto es intencional y necesario. Esto es lo que hacen los pasos:

  1. Transmitir solo documentos que tengan la etiqueta "barra" o "hola".
  2. desenrollar la matriz de etiquetas (lo que significa dividir en un documento por elemento de etiquetas
  3. transmitir solo las etiquetas exactamente "barra" o "hola" (es decir, descartar el resto de las etiquetas)
  4. agrupar por título (podría ser también por "$_id" o cualquier otra combinación del documento original sumando cuantas etiquetas (de "barra" y "hola") tenía
  5. ordenar en orden descendente por número de etiquetas relevantes
  6. (opcionalmente) limita el conjunto devuelto a los 10 principales.