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

Find dokumenter, hvis matrixfelt indeholder mindst n elementer af en given matrix

Lad os sige, at vi har følgende dokumenter i vores 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 ] }

og følgende input-array og n = 2

var inputArray = [1, 3, 0];

Vi kan returnere de dokumenter, hvor matrixfeltet indeholder mindst n elementer af en given matrix ved hjælp af aggregeringsrammen.

$match vælger kun de dokumenter med arrayets længde større eller lig med n . Dette reducerer mængden af ​​data, der skal behandles nede i pipelinen.

$redact pipeline operatør bruger en logisk tilstandsbehandling ved hjælp af $cond operatør og de særlige operationer $$KEEP at "beholde" dokumentet, hvor den logiske betingelse er sand eller $$PRUNE at "kassere" dokumentet, hvor betingelsen er falsk.

I vores tilfælde er betingelsen $gte som returnerer sand hvis $size af skæringspunktet mellem de to arrays, som vi beregner ved hjælp af $setIntersection operatoren er større end eller lig med 2 .

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

som producerer:

{ "_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. Indsæt stor plade i mongodb ved hjælp af mongo-skal

  2. $project:Er det muligt at få adgang til en egenskab for et udtryksresultat i kun et enkelt trin?

  3. Er det muligt at generere dynamisk navngivne MongoDB-samlinger?

  4. Implementering af paginering med MongoDB, Express.js &Slush