MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

$allElementsTrue . MongoDB

W MongoDB $allElementsTrue Operator potoku agregacji ocenia tablicę jako zestaw i zwraca true jeśli żaden element w tablicy nie jest false .

Jeśli tablica zawiera element, który jest false , a następnie $allElementsTrue zwraca false .

Element tablicy to true jeśli to nie jest false , null , 0 lub undefined .

Przykład

Załóżmy, że mamy kolekcję z następującym dokumentem:

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

Ten dokument zawiera tablicę.

Możemy uruchomić następujące zapytanie za pomocą $allElementsTrue aby dowiedzieć się, czy tablica zawiera element, który jest false :

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

Wynik:

{ "allElementsTrue" : true }

W tym przypadku żaden z elementów tablicy nie jest false , więc otrzymujemy wynik true .

Kiedy tablica zawiera fałsz

Dodajmy do kolekcji następujący dokument:

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

I uruchommy $allElementsTrue w stosunku do tego dokumentu:

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

Wynik:

{ "allElementsTrue" : false }

Tym razem otrzymujemy false , mimo że istnieje inny element, który jest true . Należy się tego spodziewać, ponieważ $allElementsTrue zwraca false gdy istnieje co najmniej jeden element, który jest false , niezależnie od tego, ile innych elementów jest prawdziwych.

Puste tablice

Puste tablice zwracają true .

Załóżmy, że do naszej kolekcji dodamy następujący dokument:

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

Ten dokument zawiera pustą tablicę.

Teraz uruchommy $allElementsTrue ponownie:

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

Wynik:

{ "allElementsTrue" : true }

Zgodnie z oczekiwaniami, zwraca true .

Null, 0 i niezdefiniowane wartości

To nie do końca prawda, że ​​$allElementsTrue ocenia jako false tylko gdy tablica zawiera false .

$allElementsTrue operator również zwraca się do false gdy tablica zawiera null , 0 lub undefined wartości.

Załóżmy, że do naszej kolekcji dodamy następujące dokumenty:

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

Tablica każdego dokumentu zawiera element null , 0 lub undefined .

Teraz uruchommy $allElementsTrue w stosunku do tych dokumentów:

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

Wynik:

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

Wszystkie dokumenty zwracają false zgodnie z oczekiwaniami.

Zagnieżdżone tablice

Jeśli tablica zawiera zagnieżdżoną tablicę zawierającą element, który jest false , to nie wystarczy dla $allElementsTrue aby zwrócić false . O ile $allElementsTrue dotyczy, zagnieżdżona tablica jest elementem, a zatem nie false .

Aby pokazać, o co mi chodzi, załóżmy, że wstawiamy następujące dokumenty:

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

Teraz uruchommy $allElementsTrue przeciwko tym dwóm dokumentom:

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

Wynik:

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

Widzimy, że pierwszy dokument zwrócił true a drugi zwrócił false .

Dzieje się tak, ponieważ w pierwszym dokumencie false wartość jest zagnieżdżona w innej tablicy i dlatego nie liczy się jako false wartość (tj. sama tablica jest wartością).

Jednak drugi dokument zawiera również wartość false jako jeden z elementów tablicy, a zatem ta wartość powoduje $allElementsTrue oceniać na false .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dostęp do bazy danych produkcji meteorów w 2016 r.

  2. Wszystko, co musisz wiedzieć o kliencie MongoDB

  3. MongoDB Pokaż przedmioty dla dzieci w relacji jeden do wielu

  4. SocketException:adres już używany MONGODB

  5. Jak używać wiosennych danych mongo @CompoundIndex z podkolekcjami?