sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan finder man sæt skæringspunkter mellem dokumenterne i en enkelt samling i MongoDB?

Brug aggregeringsrammen for at få det ønskede resultat. Aggregering sæt-operatoren der ville gøre magien er $setIntersection .

Følgende aggregeringspipeline opnår det, du leder efter:

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

Output :

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

OPDATERING

For at tre eller flere dokumenter skal krydses, skal du bruge $reduce operatør for at udjævne arrays. Dette giver dig mulighed for at skære et vilkårligt antal arrays, så i stedet for blot at lave en skæring af de to arrays fra doc. 1 og 3, vil dette også gælde for flere arrays.

Overvej at køre følgende samlede handling:

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. Hvordan opdaterer man værdier ved hjælp af pymongo?

  2. Kom godt i gang med MongoDB og Mongoose

  3. Redis Managed Pub/Sub Server

  4. MongoDB:upsert underdokument