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 ena
felt, og det tredje dokument har heller ikke.Her er, hvad der sker, når vi anvender
$setIsSubset
tila
ogb
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:1Forkert 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:1Dublerede 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 }