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

Obtenir des documents avec des balises dans la liste, triés par nombre total de correspondances

Comme je l'ai répondu dans In MongoDB, recherchez dans un tableau et triez par nombre de correspondances

C'est possible en utilisant Aggregation Framework.

Hypothèses

  • tags l'attribut est un ensemble (pas d'éléments répétés)

Requête

Cette approche vous oblige à dérouler les résultats et à réévaluer le prédicat de correspondance avec des résultats déroulés, donc c'est vraiment inefficace.

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

Résultats attendus

{
    "result" : [
        {
            "_id" : {
                "_id" : ObjectId("5051f1786a64bd2c54918b26")
            },
            "matches" : 3
        },
        {
            "_id" : {
                "_id" : ObjectId("5051f1726a64bd2c54918b24")
            },
            "matches" : 2
        },
        {
            "_id" : {
                "_id" : ObjectId("5051f1756a64bd2c54918b25")
            },
            "matches" : 1
        }
    ],
    "ok" : 1
}