sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $allElementsTrue

I MongoDB, $allElementsTrue aggregeringspipeline-operatör utvärderar en array som en uppsättning och returnerar true om inget element i arrayen är false .

Om arrayen innehåller ett element som är false , sedan $allElementsTrue returnerar false .

En arrays element är true om det inte är false , null , 0 , eller undefined .

Exempel

Anta att vi har en samling med följande dokument:

{ "_id" : 1, "data" : [ 1, 2, 3 ] }

Detta dokument innehåller en array.

Vi kan köra följande fråga med $allElementsTrue för att ta reda på om arrayen innehåller ett element som är false :

db.test.aggregate(
   [
     { $project: { 
        _id: 0,
        allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
         }
   ]
)

Resultat:

{ "allElementsTrue" : true }

I det här fallet är inget av arrayelementen false , och så får vi resultatet av true .

När Arrayen innehåller False

Låt oss lägga till följande dokument i samlingen:

{ "_id" : 2, "data" : [ true, false ] }

Och låt oss köra $allElementsTrue mot det dokumentet:

db.test.aggregate(
  [
    { $match: { _id: 2 } },
    { $project: { 
      _id: 0,
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Resultat:

{ "allElementsTrue" : false }

Den här gången får vi false , även om det finns ett annat element som är true . Detta är att vänta, eftersom $allElementsTrue returnerar false när det finns minst ett element som är false , oavsett hur många andra element som är sanna.

Tömma arrayer

Tomma arrayer returnerar true .

Anta att vi lägger till följande dokument i vår samling:

{ "_id" : 3, "data" : [ ] }

Detta dokument innehåller en tom array.

Låt oss nu köra $allElementsTrue igen:

db.test.aggregate(
  [
    { $match: { _id: 3 } },
    { $project: { 
      _id: 0,
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Resultat:

{ "allElementsTrue" : true }

Som förväntat returnerar den true .

Null-, 0- och odefinierade värden

Det är inte helt sant att $allElementsTrue utvärderas till false endast när arrayen innehåller false .

$allElementsTrue operatorn utvärderar också till false närhelst en array innehåller null , 0 , eller undefined värden.

Anta att vi lägger till följande dokument i vår samling:

{ "_id" : 4, "data" : [ 1, null, 3 ] }
{ "_id" : 5, "data" : [ 1, undefined, 3 ] }
{ "_id" : 6, "data" : [ 0, 1, 2 ] }

Varje dokuments array innehåller ett element av antingen null , 0 , eller undefined .

Låt oss nu köra $allElementsTrue mot dessa dokument:

db.test.aggregate(
  [
    { $match: {_id: { $in: [4,5,6] }} },
    { $project: { 
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Resultat:

{ "_id" : 4, "allElementsTrue" : false }
{ "_id" : 5, "allElementsTrue" : false }
{ "_id" : 6, "allElementsTrue" : false }

Alla dokument returnerar false som förväntat.

Inkapslade arrayer

Om arrayen innehåller en kapslad array som innehåller ett element som är false , då räcker det inte för $allElementsTrue för att returnera false . Så långt som $allElementsTrue berörs är den kapslade arrayen elementet och därför inte false .

För att visa vad jag menar, anta att vi infogar följande dokument:

{ "_id" : 7, "data" : [ 1, [ false ], 3 ] }
{ "_id" : 8, "data" : [ 1, [ false ], false ] }

Låt oss nu köra $allElementsTrue mot dessa två dokument:

db.test.aggregate(
  [
    { $match: {_id: { $in: [7,8] }} },
    { $project: { 
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Resultat:

{ "_id" : 7, "allElementsTrue" : true }
{ "_id" : 8, "allElementsTrue" : false }

Vi kan se att det första dokumentet returnerade true och den andra returnerade false .

Detta beror på att i det första dokumentet false värde är kapslat inuti en annan array och räknas därför inte som en false värde (dvs. själva arrayen är värdet).

Det andra dokumentet innehåller emellertid också false som ett av arrayelementen, och därför är det värdet det som orsakar $allElementsTrue för att utvärdera till false .


  1. Hitta alla dubbletter av dokument i en MongoDB-samling genom ett nyckelfält

  2. fråga i mongo Shell ger SyntaxError:missing :after property

  3. Kan inte hitta modulen '../build/Release/bson'] kod:'MODULE_NOT_FOUND' } js-bson:Det gick inte att ladda c++ bson-tillägget, med ren JS-version

  4. Hur man genererar ett unikt objekt-id i mongodb