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

Suchen Sie in MongoDB in einem Array und sortieren Sie nach der Anzahl der Übereinstimmungen

Ja, es ist mit Aggregation Framework möglich.

Annahmen

  • Der hier verwendete Datensatz ist derselbe, der in "Dokumente mit Tags in der Liste abrufen" verwendet wird, sortiert nach der Gesamtzahl der Übereinstimmungen
  • 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
}