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

En MongoDB busque en una matriz y ordene por número de coincidencias

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
}