sql >> Databasteknik >  >> NoSQL >> MongoDB

Hitta dokument vars arrayfält innehåller minst n element i en given array

Låt säga att vi har följande dokument i vår samling:

{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d03"), "a" : [ 0, 8, 432, 9, 34, -3 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }

och följande inmatningsmatris och n = 2

var inputArray = [1, 3, 0];

Vi kan returnera de dokument där arrayfältet innehåller minst n element av en given array med hjälp av aggregeringsramverket.

$match väljer bara de dokument med arrayens längd större eller lika med n . Detta minskar mängden data som ska bearbetas nere i pipelinen.

$redact pipeline-operatören använder en logisk villkorsbearbetning med $cond operatorn och specialoperationerna $$KEEP att "behålla" dokumentet där det logiska villkoret är sant eller $$PRUNE för att "kassera" dokumentet där villkoret är falskt.

I vårt fall är villkoret $gte som returnerar sant om $size av skärningspunkten mellan de två arrayerna, som vi beräknar med hjälp av $setIntersection operatorn är större än eller lika med 2 .

db.collection.aggregate(
    [ 
        { "$match": { "a.1": { "$exists": true } } }, 
        { "$redact": { 
            "$cond": [ 
                { "$gte": [ 
                    { "$size": { "$setIntersection": [ "$a", inputArray ] } }, 
                    2
                ]},
                "$$KEEP", 
                "$$PRUNE" 
            ]
        }}
    ]
)

som producerar:

{ "_id" : ObjectId("5759658e654456bf4a014d01"), "a" : [ 1, 3, 9, 2, 9, 0 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d02"), "a" : [ 0, 8, 1 ] }
{ "_id" : ObjectId("5759658e654456bf4a014d04"), "a" : [ 0, 0, 4, 3, 2, 7 ] }


  1. Uppdatera en kapslad array med MongoDB

  2. Hur kontrollerar jag noll/null i Redis' Lua cjson?

  3. Hur ansluter man till en Redis-behållare med Docker Compose?

  4. MongoDB $toDouble