sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $setIsSubset

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 ingen a och det tredje dokumentet har inte heller.

Det här är vad som händer när vi tillämpar $setIsSubset till a och b 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:1

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

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

  1. MongoDB $sekund

  2. Multiplicera fält med värde i Mongodb

  3. Hur förstör man jobb som ställs i kö av resque-arbetare?

  4. Få MongoDB på Linux att lyssna på fjärranslutningar