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

Najděte dokumenty, jejichž pole pole obsahuje alespoň n prvků daného pole

Řekněme, že máme ve sbírce následující dokumenty:

{ "_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 ] }

a následující vstupní pole a n = 2

var inputArray = [1, 3, 0];

Můžeme vrátit ty dokumenty, kde pole pole obsahuje alespoň n prvků daného pole pomocí agregačního rámce.

$match vybere pouze dokumenty s délkou pole větší nebo rovnou n . Tím se sníží množství dat, která mají být zpracována v procesu.

$redact Operátor potrubí používá zpracování logické podmínky pomocí $cond operátor a speciální operace $$KEEP "uchovat" dokument, kde je logická podmínka pravdivá nebo $$PRUNE "zahodit" dokument, kde je podmínka nepravdivá.

V našem případě je podmínkou $gte což vrátí hodnotu true, pokud je $size průniku dvou polí, který vypočítáme pomocí $setIntersection operátor je větší nebo roven 2 .

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

který produkuje:

{ "_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. Vytvoření oblasti pro správu za pět minut pomocí AdminBro, express, mongoDB, mongoose

  2. Neočekávaný výstupní kód mongo 100. Restartování

  3. Podmnožina pole v potrubí agregačního rámce

  4. Efektivní stránkování v MongoDB pomocí mgo