sql >> Database >  >> NoSQL >> MongoDB

Documenten met tags in lijst ophalen, gerangschikt op totaal aantal overeenkomsten

Zoals ik antwoordde in In MongoDB zoek in een array en sorteer op aantal overeenkomsten

Het is mogelijk met behulp van Aggregation Framework.

Aannames

  • tags attribuut is een set (geen herhaalde elementen)

Zoekopdracht

Deze aanpak dwingt je om de resultaten af ​​te wikkelen en het wedstrijdpredikaat opnieuw te evalueren met afgewikkelde resultaten, dus het is echt inefficiënt.

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

Verwachte resultaten

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


  1. mangoest:vind gegevens door een reeks modellen te herhalen

  2. MongoDB krijgt SubDocument

  3. MongoDB hernoemen databaseveld binnen array

  4. MongoDB $seconde