Dans MongoDB, le $setIsSubset
l'opérateur de pipeline d'agrégation accepte deux tableaux et renvoie true
lorsque le premier tableau est un sous-ensemble du second, et false
quand ce n'est pas le cas.
Le premier tableau est également considéré comme un sous-ensemble lorsqu'il est égal au second tableau.
$setIsSubset
accepte deux arguments, qui peuvent tous deux être n'importe quelle expression valide tant qu'ils se résolvent chacun en un tableau. $setIsSubset
traite les tableaux comme des ensembles.
Exemple
Supposons que nous ayons une collection appelée data
avec les documents suivants :
{ "_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 ] }
Nous pouvons appliquer le $setIsSubset
opérateur contre le a
et b
champs dans ces documents.
Exemple :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $setIsSubset: [ "$a", "$b" ] }
}
}
]
)
Résultat :
{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2, 3 ], "résultat" :vrai }{ "a" :[ 1, 2, 3 ], "b" :[ 1, 2 ], "résultat" :faux }{ "a" :[ 1, 2 ], "b" :[ 1, 2, 3 ], "résultat" :vrai }{ "a" :[ 1, 2, 3 ], "b" :[ 3, 4, 5 ], "résultat" :faux }{ "a" :[ 1, 2, 3 ], "b" :[ 4, 5, 6 ], "résultat " :faux }
Tableaux imbriqués
Le $setIsSubset
L'opérateur ne descend dans aucun tableau imbriqué. Il évalue uniquement les tableaux de niveau supérieur.
Supposons que notre collection contienne également les documents suivants :
{ "_id" :6, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :7, "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2 ], 3 ] }
Et nous appliquons $setIsSubset
à ces deux documents :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 6, 7 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $setIsSubset: [ "$a", "$b" ] }
}
}
]
)
Résultat :
{ "a" :[ 1, 2, 3 ], "b" :[ [ 1, 2, 3 ] ], "résultat" :faux }{ "a" :[ 1, 2, 3 ], " b" :[ [ 1, 2 ], 3 ], "résultat" :faux }
Dans le premier document, le b
champ contenait un tableau qui ne contenait qu'un seul élément - un autre tableau. Dans ce cas, il a été constaté que a
n'est pas un sous-ensemble de b
.
Cependant, supposons que nous ayons les documents suivants :
{ "_id" :8, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ] }{ "_id" :9, "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ] }
Le document 8 contient un tableau imbriqué à la fois au a
et b
champs, et les deux tableaux sont identiques.
Voici ce qui se passe lorsque nous appliquons $setIsSubset
à ces documents :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 8, 9 ] } } },
{
$project:
{
_id: 0,
a: 1,
b: 1,
result: { $setIsSubset: [ "$a", "$b" ] }
}
}
]
)
Résultat :
{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2, 3 ] ], "résultat" :vrai }{ "a" :[ [ 1, 2, 3 ] ], "b" :[ [ 1, 2 ], 3 ], "résultat" :faux }
Dans le premier document, a
correspond à b
exactement, et donc le résultat est true
.
Dans le deuxième document, a
n'est pas un sous-ensemble de b
, et donc le résultat est false
.
Champs manquants
Application de $setIsSubset
à un champ inexistant entraîne une erreur.
Considérez les documents suivants :
{ "_id" :10, "a" :[ 1, 2, 3 ] }{ "_id" :11, "b" :[ 1, 2, 3 ] }{ "_id" :12 }Le premier document n'a pas de
b
champ, le deuxième document n'a pas dea
champ, et le troisième document n'a ni l'un ni l'autre.Voici ce qui se passe lorsque nous appliquons
$setIsSubset
aua
etb
champs :db.data.aggregate( [ { $match: { _id: { $in: [ 10, 11, 12 ] } } }, { $project: { _id: 0, a: 1, b: 1, result: { $setIsSubset: [ "$a", "$b" ] } } } ] )
Résultat :
Erreur :la commande a échoué :{ "ok" :0, "errmsg" :"les deux opérandes de $setIsSubset doivent être des tableaux. Le deuxième argument est de type :missing", "code" :17042, "codeName" :"Location17042 "} :l'agrégat a échoué :[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:1Type de données incorrect
Les deux opérandes de
$setIsSubset
doivent être des tableaux. Si ce n'est pas le cas, une erreur est générée.Supposons que notre collection contienne les documents suivants :
{ "_id" :13, "a" :[ 1, 2, 3 ], "b" :3 }{ "_id" :14, "a" :3, "b" :[ 1, 2, 3 ] }{ "_id" :15, "a" :2, "b" :3 }Et nous appliquons
$setIsSubset
à ces documents :db.data.aggregate( [ { $match: { _id: { $in: [ 13, 14, 15 ] } } }, { $project: { _id: 0, a: 1, b: 1, result: { $setIsSubset: [ "$a", "$b" ] } } } ] )
Résultat :
Erreur :la commande a échoué :{ "ok" :0, "errmsg" :"les deux opérandes de $setIsSubset doivent être des tableaux. Le deuxième argument est de type :double", "code" :17042, "codeName" :"Location17042 "} :l'agrégat a échoué :[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:1Valeurs en double
Le
$setIsSubset
l'opérateur ignore les doublons. Il ignore également l'ordre des éléments..Supposons que nous ayons les documents suivants :
{ "_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" :[ ] }Ensuite, nous appliquons le
$setIsSubset
opérateur pour eux :db.data.aggregate( [ { $match: { _id: { $in: [ 16, 17, 18, 19, 20, 21 ] } } }, { $project: { _id: 0, a: 1, b: 1, result: { $setIsSubset: [ "$a", "$b" ] } } } ] )
Résultat :
{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2, 3 ], "result" :vrai }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ 1, 2 ], "résultat" :faux }{ "a" :[ 1, 1, 2, 2, 3, 3 ], "b" :[ ] , "résultat" :faux }{ "a" :[ 3, 2, 1, 2, 3, 1 ], "b" :[ 2, 3, 1 ], "résultat" :vrai }{ "a" :[ 1, 3, 2, 2, 3, 1 ], "b" :[ 2, 1 ], "résultat" :faux }{ "a" :[ 2, 3, 1, 2, 3, 1 ], "b " :[ ], "résultat" :faux }