MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Holen Sie sich Dokumente mit Tags in der Liste, geordnet nach der Gesamtzahl der Übereinstimmungen

Wie ich in In MongoDB geantwortet habe, suche in einem Array und sortiere nach Anzahl der Übereinstimmungen

Es ist mit Aggregation Framework möglich.

Annahmen

  • tags Attribut ist eine Menge (keine wiederholten Elemente)

Abfrage

Dieser Ansatz zwingt Sie, die Ergebnisse abzuwickeln und das Übereinstimmungsprädikat mit abgewickelten Ergebnissen neu zu bewerten, also ist es wirklich ineffizient.

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

Erwartete Ergebnisse

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