Sí, es posible usar Aggregation Framework.
Suposiciones
- El conjunto de datos que se usa aquí es el mismo que se usa en Obtener documentos con etiquetas en la lista, ordenados por número total de coincidencias
tags
el atributo es un conjunto (sin elementos repetidos)
Consulta
Este enfoque lo obliga a deshacer los resultados y reevaluar el predicado de coincidencia con resultados desvinculados, por lo que es realmente ineficiente.
db.test_col.aggregate(
{$match: {tags: {$in: ["shirt","cotton","black"]}}},
{$unwind: "$tags"},
{$match: {tags: {$in: ["shirt","cotton","black"]}}},
{$group: {
_id:{"_id":1},
matches:{$sum:1}
}},
{$sort:{matches:-1}}
);
Resultados esperados
{
"result" : [
{
"_id" : {
"_id" : ObjectId("5051f1786a64bd2c54918b26")
},
"matches" : 3
},
{
"_id" : {
"_id" : ObjectId("5051f1726a64bd2c54918b24")
},
"matches" : 2
},
{
"_id" : {
"_id" : ObjectId("5051f1756a64bd2c54918b25")
},
"matches" : 1
}
],
"ok" : 1
}