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

MongoDB $anyElementTrue

V MongoDB, $anyElementTrue Operátor agregačního kanálu vyhodnotí pole jako množinu a vrátí true pokud je některý z prvků true .

Pokud žádný z prvků není true , pak 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 s $anyElementTrue zjistit, zda pole obsahuje nějaké prvky, které se vyhodnotí jako true :

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

Výsledek:

{ "anyElementTrue" : true }

V tomto případě se všechny prvky pole vyhodnotí jako true (tj. nejsou false , null , 0 , nebo undefined ), a tak dostaneme výsledek true .

Když žádný prvek není pravdivý

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

{ "_id" : 2, "data" : [ false, undefined, 0, null ] }

A spusťte $anyElementTrue proti tomuto dokumentu:

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

Výsledek:

{ "anyElementTrue" : false }

Jak můžeme vidět zde, $anyElementTrue vyhodnotí jako false vždy, když pole obsahuje false , null , 0 , nebo undefined hodnoty.

Když pole obsahuje True i False

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

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

A spusťte $anyElementTrue proti tomuto dokumentu:

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

Výsledek:

{ "anyElementTrue" : true }

Dostaneme true , i když je zde další prvek, který je false . To se dá očekávat, protože $anyElementTrue vrátí true vždy, když existuje alespoň jeden prvek, který je true bez ohledu na to, kolik dalších prvků je nepravdivý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" : 4, "data" : [ ] }

Tento dokument obsahuje prázdné pole.

Nyní spustíme $anyElementTrue znovu:

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

Výsledek:

{ "anyElementTrue" : false }

Vrací false , protože prázdné pole není false .

Vnořená pole

$anyElementTrue operátor není sestoupit do libovolných vnořených polí. Vyhodnocuje pole na nejvyšší úrovni.

Tedy zda vnořené pole obsahuje prvky, které jsou true nebo false je irelevantní pro $anyElementTrue . Až po $anyElementTrue je vnořené pole prvkem, a proto true .

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

{ "_id" : 5, "data" : [ false, [ false ] ] }
{ "_id" : 6, "data" : [ false, false ] }

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

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

Výsledek:

{ "_id" : 5, "anyElementTrue" : true }
{ "_id" : 6, "anyElementTrue" : false }

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

Je to proto, že pole v prvním dokumentu obsahuje vnořené pole, které stačí k vrácení true bez ohledu na jeho obsah.

Druhý dokument neobsahuje vnořené pole – obsahuje pouze dva false hodnoty – a proto se vyhodnotí jako false .


  1. Měli byste povolit žurnálování MongoDB?

  2. Porovnejte s podřetězcem v agregaci mongodb

  3. Jak nainstalovat Apache CouchDB v Ubuntu 20.04

  4. Jak nakonfigurujete Embedded MongDB pro testování integrace v aplikaci Spring Boot?