I MongoDB, $setIsSubset
aggregeringspipeline-operatören accepterar två arrayer och returnerar true
när den första matrisen är en delmängd av den andra och false
när det inte är det.
Den första matrisen anses också vara en delmängd när den är lika med den andra matrisen.
$setIsSubset
accepterar två argument, som båda kan vara vilket giltigt uttryck som helst så länge som var och en löser sig till en array. $setIsSubset
behandlar arrayerna som uppsättningar.
Exempel
Anta att vi har en samling som heter data
med följande dokument:
{ "_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 använda $setIsSubset
operatorn mot a
och b
fält i dessa dokument.
Exempel:
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" :sant }{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ], "result" :false }{ "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ], "result" :sant }{ "a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ], "result" :false }{ "a" :[ 1, 2, 3 ], "b" :[ 4, 5, 6 ], "resultat " :falskt }
Inkapslade arrayer
$setIsSubset
operatorn går inte ner i några kapslade arrayer. Den utvärderar bara arrayer på toppnivå.
Anta att vår samling också innehåller följande dokument:
{ "_id" :6, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :7, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2 ], 3 ] }
Och vi tillämpar $setIsSubset
till dessa två dokument:
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" :false }
I det första dokumentet, b
fältet innehöll en array som bara innehöll ett element – en annan array. I det här fallet upptäcktes att a
är inte en delmängd av b
.
Anta dock att vi har följande dokument:
{ "_id" :8, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :9, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ] }
Dokument 8 innehåller en kapslad array vid både a
och b
fält, och båda arrayerna är identiska.
Det här är vad som händer när vi tillämpar $setIsSubset
till dessa dokument:
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" :sant }{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ], "result" :false }
I det första dokumentet, a
matchar b
exakt, och så resultatet är true
.
I det andra dokumentet, a
är inte en delmängd av b
, och så resultatet är false
.
Fält saknas
Använder $setIsSubset
till ett icke-existerande fält resulterar i ett fel.
Tänk på följande dokument:
{ "_id" :10, "a" :[ 1, 2, 3 ] }{ "_id" :11, "b" :[ 1, 2, 3 ] }{ "_id" :12 }Det första dokumentet har ingen
b
fältet har det andra dokumentet ingena
och det tredje dokumentet har inte heller.Det här är vad som händer när vi tillämpar
$setIsSubset
tilla
ochb
fält:db.data.aggregate( [ { $match: { _id: { $in: [ 10, 11, 12 ] } } }, { $project: { _id: 0, a: 1, b: 1, result: { $setIsSubset: [ "$a", "$b" ] } } } ] )
Resultat:
Fel:kommando misslyckades:{ "ok" :0, "errmsg" :"båda operanderna för $setIsSubset måste vara arrayer. Andra argumentet är av typen:saknas", "code" :17042, "codeName" :"Location17042 "} :aggregat misslyckades :[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@(skal):1:1Fel datatyp
Båda operanderna för
$setIsSubset
måste vara arrayer. Om de inte är det skapas ett felmeddelande.Anta att vår samling innehåller följande dokument:
{ "_id" :13, "a" :[ 1, 2, 3 ], "b" :3 }{ "_id" :14, "a" :3, "b" :[ 1, 2, 3 ] }{ "_id" :15, "a" :2, "b" :3 }Och vi tillämpar
$setIsSubset
till dessa dokument:db.data.aggregate( [ { $match: { _id: { $in: [ 13, 14, 15 ] } } }, { $project: { _id: 0, a: 1, b: 1, result: { $setIsSubset: [ "$a", "$b" ] } } } ] )
Resultat:
Fel:kommando misslyckades:{ "ok" :0, "errmsg" :"båda operanderna för $setIsSubset måste vara arrayer. Det andra argumentet är av typen:double", "code" :17042, "codeName" :"Location17042 "} :aggregat misslyckades :[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@(skal):1:1Duplicera värden
$setIsSubset
operatören ignorerar dubbletter. Den ignorerar också ordningen på elementen...Anta att vi har följande dokument:
{ "_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" :[ ] }Sedan tillämpar vi
$setIsSubset
operatör till 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" :sant }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2 ], "result" :false }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ ] , "result" :false }{ "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ], "result" :true }{ "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ], "result" :false }{ "a" :[ 2, 3, 1, 2, 3, 1 ], "b " :[ ], "resultat" :falskt }