MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $setIsSubset

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 de a champ, et le troisième document n'a ni l'un ni l'autre.

Voici ce qui se passe lorsque nous appliquons $setIsSubset au a et b 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:1

Type 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:1

Valeurs 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 }