sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $anyElementTrue

I MongoDB, $anyElementTrue aggregeringspipeline-operatör utvärderar en array som en uppsättning och returnerar true om något av elementen är true .

Om inget av elementen är true , sedan returnerar den 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 $anyElementTrue för att ta reda på om arrayen innehåller några element som utvärderas till true :

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

Resultat:

{ "anyElementTrue" : true }

I det här fallet utvärderas alla arrayelement till true (dvs. de är inte false , null , 0 , eller undefined ), och så får vi resultatet av true .

När inget element är sant

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

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

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

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

Resultat:

{ "anyElementTrue" : false }

Som vi kan se här, $anyElementTrue utvärderas till false närhelst en array innehåller false , null , 0 , eller undefined värden.

När arrayen innehåller både sant och falskt

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

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

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

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

Resultat:

{ "anyElementTrue" : true }

Vi får true , även om det finns ett annat element som är false . Detta är att vänta, eftersom $anyElementTrue returnerar true när det finns minst ett element som är true , oavsett hur många andra element som är falska.

Tömma arrayer

Tomma arrayer returnerar true .

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

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

Detta dokument innehåller en tom array.

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

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

Resultat:

{ "anyElementTrue" : false }

Den returnerar false , eftersom en tom array inte är false .

Inkapslade arrayer

$anyElementTrue operatören inte gå ner i alla kapslade arrayer. Den utvärderar arrayen på toppnivå.

Därför, om den kapslade arrayen innehåller element som är true eller false är irrelevant för $anyElementTrue . Så långt som $anyElementTrue berörs är den kapslade arrayen elementet och därför true .

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

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

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

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

Resultat:

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

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

Detta beror på att arrayen i det första dokumentet innehåller en kapslad array, vilket är tillräckligt för att returnera true , oavsett dess innehåll.

Det andra dokumentet innehåller inte en kapslad array – det innehåller bara två false värden – och den utvärderas därför till false .


  1. Redis och frågevärden

  2. Bygg en reaktiv publikation med ytterligare fält i varje dokument

  3. Sök i MongoDB i en array och sortera efter antal matchningar

  4. Geografiskt distribuerade MongoDB Replica Sets för 100 % drifttid