sql >> Databáze >  >> NoSQL >> MongoDB

Jak najít průsečík množin mezi dokumenty v jedné kolekci v MongoDB?

Použijte rámec agregace abyste dosáhli požadovaného výsledku. Operátor sady agregace to by udělalo kouzlo, je $setIntersection .

Následující agregační kanál dosáhne toho, o co usilujete:

db.test.aggregate([
    {
        "$match": {
            "_id": { "$in": [1, 3] }
        }
    },
    {
        "$group": {
            "_id": 0,
            "set1": { "$first": "$set" },
            "set2": { "$last": "$set" }
        }
    },
    {
        "$project": { 
            "set1": 1, 
            "set2": 1, 
            "commonToBoth": { "$setIntersection": [ "$set1", "$set2" ] }, 
            "_id": 0 
        }
    }
])

Výstup :

/* 0 */
{
    "result" : [ 
        {
            "set1" : [1,2,3,4,5],
            "set2" : [1,2,5,10,22],
            "commonToBoth" : [1,2,5]
        }
    ],
    "ok" : 1
}

AKTUALIZACE

Pro protnutí tří nebo více dokumentů byste potřebovali $reduce operátora pro zploštění polí. To vám umožní protínat libovolný počet polí, takže místo pouhého průniku dvou polí z dokumentů 1 a 3 to bude platit i pro více polí.

Zvažte spuštění následující agregační operace:

db.test.aggregate([
    { "$match": { "_id": { "$in": [1, 3] } } },
    {
        "$group": {
            "_id": 0,
            "sets": { "$push": "$set" },
            "initialSet": { "$first": "$set" }
        }
    },
    {
        "$project": {
            "commonSets": {
                "$reduce": {
                    "input": "$sets",
                    "initialValue": "$initialSet",
                    "in": { "$setIntersection": ["$$value", "$$this"] }
                }
            }
        }
    }
])



  1. Redis ukládací seznam uvnitř hash

  2. mongodb:nalezení nejvyšší číselné hodnoty sloupce

  3. Redis jak uložit asociativní pole? Set nebo Hash nebo List?

  4. Hledání hodnoty libovolného pole v MongoDB bez jeho explicitního pojmenování