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:
- Transmitir solo documentos que tengan la etiqueta "barra" o "hola".
- desenrollar la matriz de etiquetas (lo que significa dividir en un documento por elemento de etiquetas
- transmitir solo las etiquetas exactamente "barra" o "hola" (es decir, descartar el resto de las etiquetas)
- 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
- ordenar en orden descendente por número de etiquetas relevantes
- (opcionalmente) limita el conjunto devuelto a los 10 principales.