sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $allElementsTrue

V MongoDB, $allElementsTrue Operátor agregačního kanálu vyhodnotí pole jako množinu a vrátí true pokud žádný prvek v poli není false .

Pokud pole obsahuje prvek, který je false a poté $allElementsTrue vrátí false .

Prvek pole je true pokud to není false , null , 0 , nebo undefined .

Příklad

Předpokládejme, že máme kolekci s následujícím dokumentem:

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

Tento dokument obsahuje pole.

Můžeme spustit následující dotaz pomocí $allElementsTrue zjistit, zda pole obsahuje prvek, který je false, či nikoli :

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

Výsledek:

{ "allElementsTrue" : true }

V tomto případě není žádný z prvků pole false , a tak dostaneme výsledek true .

Když pole obsahuje hodnotu False

Přidejme do sbírky následující dokument:

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

A spustíme $allElementsTrue proti tomuto dokumentu:

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

Výsledek:

{ "allElementsTrue" : false }

Tentokrát dostaneme false , i když existuje další prvek, který je true . To se dá očekávat, protože $allElementsTrue vrátí false vždy, když je alespoň jeden prvek false bez ohledu na to, kolik dalších prvků je pravdivých.

Prázdná pole

Prázdná pole vrátí true .

Předpokládejme, že do naší sbírky přidáme následující dokument:

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

Tento dokument obsahuje prázdné pole.

Nyní spustíme $allElementsTrue znovu:

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

Výsledek:

{ "allElementsTrue" : true }

Podle očekávání vrací true .

Null, 0 a nedefinované hodnoty

Není tak úplně pravda, že $allElementsTrue vyhodnotí jako false pouze když pole obsahuje false .

$allElementsTrue operátor také vyhodnotí jako false vždy, když pole obsahuje null , 0 , nebo undefined hodnoty.

Předpokládejme, že do naší sbírky přidáme následující dokumenty:

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

Pole každého dokumentu obsahuje prvek buď null , 0 , nebo undefined .

Nyní spustíme $allElementsTrue proti těmto dokumentům:

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

Výsledek:

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

Všechny dokumenty vrátí false podle očekávání.

Vnořená pole

Pokud pole obsahuje vnořené pole, které obsahuje prvek, který je false , pak to nestačí pro $allElementsTrue vrátit false . Až po $allElementsTrue Pokud jde o to, vnořené pole je prvek, a proto ne false .

Abychom demonstrovali, co tím myslím, předpokládejme, že vložíme následující dokumenty:

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

Nyní spustíme $allElementsTrue proti těmto dvěma dokumentům:

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

Výsledek:

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

Vidíme, že první dokument vrátil true a druhý vrátil false .

Je to proto, že v prvním dokumentu je false hodnota je vnořena do jiného pole, a proto se nepočítá jako false value (tj. samotné pole je hodnotou).

Druhý dokument však také obsahuje false jako jeden z prvků pole, a proto tato hodnota způsobuje $allElementsTrue vyhodnotit jako false .


  1. Mongoose:CastError:Odeslání do ObjectId selhalo pro hodnotu [object Object] na cestě _id

  2. Čtení dat z Redis na Flink

  3. Klonování instance MongoDB nebo sady replik

  4. Proč byste měli stále používat úložiště MMAPv1 pro MongoDB