V MongoDB můžete použít $exists
operátor dotazu na elementy, aby odpovídal dokumentům, které obsahují konkrétní pole.
Můžete jej také použít ke spárování dokumentů, které neobsahují konkrétní pole.
Můžete jej také použít ve spojení s jinými operátory, jako je $nin
přiřadit dokumenty, kde dané pole existuje, ale neobsahuje konkrétní hodnotu.
Příklad
Předpokládejme, že máme sbírku nazvanou cats
který obsahuje následující dokumenty:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Tyto dokumenty jsou mírně nekonzistentní s ohledem na pole, která mají. Některé mají weight
pole, ostatní mají height
pole, někteří mají born
pole atd.
Můžeme použít $exists
operátor vrátit dokumenty z této kolekce, které mají specifické pole.
Příklad:
db.cats.find( { weight: { $exists: true } } )
Výsledek:
{ "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Vidíme, že pouze ty dokumenty, které obsahují weight
pole jsou vráceny.
Pole, která obsahují null
$exists
operátor zahrnuje pole obsahující null
. Nerozlišuje mezi null
a non-null
hodnoty.
Příklad:
db.cats.find( { name: { $exists: true } } )
Výsledek:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Vidíme, že dokument 5 byl vrácen, i když jeho name
pole je null
.
Existuje bez konkrétní hodnoty
Můžete kombinovat $exists
s jinými operátory vrátit dokumenty, které obsahují pole, ale toto pole neobsahuje konkrétní hodnotu.
Příklad:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Výsledek:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
Toto je jiný výsledek, než jaký bychom viděli, kdybychom jednoduše použili $nin
bez $exists
operátor.
Takto by to vypadalo:
db.cats.find( { weight: { $nin: [20,30] } } )
Výsledek:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Dokumenty, které neobsahují konkrétní pole
Můžete použít $exists: false
vrátit dokumenty, které není obsahovat zadané pole.
Příklad:
db.cats.find( { name: { $exists: false } } )
Výsledek:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
V tomto případě jeden dokument v kolekci neobsahuje name
pole.
Zkontrolujte více polí
Existenci více polí můžete zkontrolovat tak, že je oddělíte čárkou.
Příklad:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Výsledek:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
Tento příklad vrátí všechny dokumenty, které obsahují name
pole a height
pole.