MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $anyElementTrue

В MongoDB, $anyElementTrue Операторът на конвейера за агрегиране оценява масив като набор и връща true ако някой от елементите е true .

Ако нито един от елементите не е true , след което връща false .

Елементът на масива е true ако не е false , null , 0 , или undefined .

Пример

Да предположим, че имаме колекция със следния документ:

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

Този документ съдържа масив.

Можем да изпълним следната заявка с $anyElementTrue за да разберете дали масивът съдържа или не елементи, които се оценяват на true :

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

Резултат:

{ "anyElementTrue" : true }

В този случай всички елементи на масива се оценяват на true (т.е. не са false , null , 0 , или undefined ), и така получаваме резултат от true .

Когато нито един елемент не е вярно

Нека добавим следния документ към колекцията:

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

И нека изпълним $anyElementTrue срещу този документ:

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

Резултат:

{ "anyElementTrue" : false }

Както можем да видим тук, $anyElementTrue оценява на false всеки път, когато масив съдържа false , null , 0 , или undefined стойности.

Когато масивът съдържа и вярно, и невярно

Нека добавим следния документ към колекцията:

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

И нека изпълним $anyElementTrue срещу този документ:

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

Резултат:

{ "anyElementTrue" : true }

Получаваме true , въпреки че има друг елемент, който е false . Това може да се очаква, защото $anyElementTrue връща true винаги, когато има поне един елемент, който е true , независимо колко други елемента са фалшиви.

Празни масиви

Празните масиви връщат true .

Да предположим, че добавяме следния документ към нашата колекция:

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

Този документ съдържа празен масив.

Сега нека изпълним $anyElementTrue отново:

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

Резултат:

{ "anyElementTrue" : false }

Връща false , защото празният масив не е false .

Вложени масиви

$anyElementTrue операторът не слезе във всякакви вложени масиви. Той оценява масива на най-високо ниво.

Следователно, дали вложеният масив съдържа елементи, които са true или false е без значение за $anyElementTrue . Що се отнася до $anyElementTrue е загрижен, вложеният масив е елементът и следователно true .

За да демонстрирам какво имам предвид, да предположим, че вмъкваме следните документи:

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

Сега нека изпълним $anyElementTrue срещу тези два документа:

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

Резултат:

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

Можем да видим, че първият документ върна true а вторият върна false .

Това е така, защото масивът в първия документ съдържа вложен масив, който е достатъчен, за да върне true , независимо от съдържанието му.

Вторият документ не съдържа вложен масив – съдържа само две false стойности – и следователно се оценява на false .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Актуализацията на Mongoose не се актуализира:{ ok:0, n:0, nModified:0 }

  2. Как се увеличава правилно много дати в mongoDB?

  3. Как да променя реда на масива с MongoDB?

  4. Как да изтриете N броя документи в mongodb

  5. Поточно предаване от курсор на mongodb до Express отговор в node.js