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

MongoDB $setIsSubset

I MongoDB er $setIsSubset aggregeringspipeline-operatør accepterer to arrays og returnerer true når den første matrix er en delmængde af den anden, og false når det ikke er.

Det første array betragtes også som en delmængde, når det er lig med det andet array.

$setIsSubset accepterer to argumenter, som begge kan være et hvilket som helst gyldigt udtryk, så længe de hver især løses til en matrix. $setIsSubset behandler arrays som sæt.

Eksempel

Antag, at vi har en samling kaldet data med følgende dokumenter:

{ "_id" :1, "a" :[ 1, 2, 3 ], "b" :[ 1, 2, 3 ] }{ "_id" :2, "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ] }{ "_id" :3, "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ] }{ "_id" :4, " a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ] }{ "_id" :5, "a" :[ 1, 2, 3 ], "b" :[ 4, 5 , 6 ] }

Vi kan anvende $setIsSubset operator mod a og b felter i disse dokumenter.

Eksempel:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Resultat:

{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2, 3 ], "result" :sand }{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ], "result" :falsk }{ "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ], "result" :sand }{ "a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ], "resultat" :falsk }{ "a" :[ 1, 2, 3 ], "b" :[ 4, 5, 6 ], "resultat " :falsk }

Indlejrede arrays

$setIsSubset operatoren går ikke ned i nogen indlejrede arrays. Den evaluerer kun arrays på øverste niveau.

Antag, at vores samling også indeholder følgende dokumenter:

{ "_id" :6, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :7, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2 ], 3 ] }

Og vi anvender $setIsSubset til disse to dokumenter:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 6, 7 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Resultat:

{ "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ], "result" :false }{ "a" :[ 1, 2, 3 ], " b" :[ [ 1, 2 ], 3 ], "result" :falsk }

I det første dokument er b felt indeholdt et array, der kun indeholdt ét element – ​​et andet array. I dette tilfælde blev det fundet, at a er ikke en delmængde af b .

Antag dog, at vi har følgende dokumenter:

{ "_id" :8, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :9, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ] }

Dokument 8 indeholder et indlejret array ved både a og b felter, og begge arrays er identiske.

Her er, hvad der sker, når vi anvender $setIsSubset til disse dokumenter:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 8, 9 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Resultat:

{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ], "result" :sand }{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ], "resultat" :falsk }

I det første dokument, a matcher b præcis, og så resultatet er true .

I det andet dokument, a er ikke en delmængde af b , og så resultatet er false .

Manglende felter

Anvender $setIsSubset til et ikke-eksisterende felt resulterer i en fejl.

Overvej følgende dokumenter:

{ "_id" :10, "a" :[ 1, 2, 3 ] }{ "_id" :11, "b" :[ 1, 2, 3 ] }{ "_id" :12 } 

Det første dokument har ikke en b felt, har det andet dokument ikke en a felt, og det tredje dokument har heller ikke.

Her er, hvad der sker, når vi anvender $setIsSubset til a og b felter:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 10, 11, 12 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Resultat:

Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"begge operander af $setIsSubset skal være arrays. Andet argument er af typen:mangler", "code" :17042, "codeName" :"Location17042 "} :aggregat mislykkedes :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell):1:1

Forkert datatype

Begge operander af $setIsSubset skal være arrays. Hvis de ikke er det, vises der en fejl.

Antag, at vores samling indeholder følgende dokumenter:

{ "_id" :13, "a" :[ 1, 2, 3 ], "b" :3 }{ "_id" :14, "a" :3, "b" :[ 1, 2, 3 ] }{ "_id" :15, "a" :2, "b" :3 }

Og vi anvender $setIsSubset til disse dokumenter:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 13, 14, 15 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Resultat:

Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"begge operander af $setIsSubset skal være arrays. Andet argument er af typen:double", "code" :17042, "codeName" :"Location17042 "} :aggregat mislykkedes :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell):1:1

Dublerede værdier

$setIsSubset operatør ignorerer dubletter. Den ignorerer også rækkefølgen af ​​elementerne..

Antag, at vi har følgende dokumenter:

{ "_id" :16, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ] }{ "_id" :17, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2 ] }{ "_id" :18, "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ ] }{ "_id" :19, "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ] }{ "_id" :20 , "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ] }{ "_id" :21, "a" :[ 2, 3, 1, 2, 3 , 1 ], "b" :[ ] }

Derefter anvender vi $setIsSubset operatør til dem:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 16, 17, 18, 19, 20, 21 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Resultat:

{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ], "result" :sand }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2 ], "resultat" :falsk }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ ] , "result" :false }{ "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ], "result" :sand }{ "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ], "resultat" :falsk }{ "a" :[ 2, 3, 1, 2, 3, 1 ], "b " :[ ], "resultat" :falsk }

  1. Spring Data MongoDB:Fremskrivninger og aggregationer

  2. Sådan søger du efter indholdsværdi i redis by BookSleeve

  3. Læs data fra Redis til Flink

  4. ønsker at køre redis-server i baggrunden nonstop