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

Dans MongoDB, recherchez dans un tableau et triez par nombre de correspondances

Oui, c'est possible en utilisant Aggregation Framework.

Hypothèses

  • L'ensemble de données utilisé ici est le même que celui utilisé dans Obtenir des documents avec des balises dans la liste, classés par nombre total de correspondances
  • 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
}