I MongoDB er $or
aggregeringspipeline-operator evaluerer et eller flere udtryk og returnerer true
hvis nogen vurderes til sand
. Ellers returnerer den false
.
Syntaks
Syntaksen ser sådan ud:
{ $or:[ , , ... ] }
Eksempel
Antag, at vi har en samling kaldet data
med følgende dokument:
{ "_id" :1, "a" :10, "b" :2, "c" :20 }
Her er, hvad der sker, når vi bruger $or
at teste for to forhold i forhold til dette dokument:
db.data.aggregate( [ { $match:{ _id:1 } }, { $project:{ _id:0, a:1, b:1, result:{ $or:[ { $ gt:[ "$a", 9 ] }, { $lt:[ "$b", 1 ] } ] } } } ])
Resultat:
{ "a" :10, "b" :2, "result" :sand }
Vi kan se den $or
returnerede true
, selvom et af udtrykkene løses til false
. Dette er fordi det returnerer true
hvis nogen af udtrykkene er sand
.
Her er det igen, men med begge udtryk, der løses til false
.
db.data.aggregate( [ { $match:{ _id:1 } }, { $project:{ _id:0, a:1, b:1, result:{ $or:[ { $ gt:[ "$a", 20 ] }, { $lt:[ "$b", 1 ] } ] } } } ])
Resultat:
{ "a" :10, "b" :2, "result" :falsk }
Mere end to argumenter
Som nævnt, $or
accepterer et eller flere udtryk. Det foregående eksempel bruger to udtryk. Her er et eksempel, der bruger tre:
db.data.aggregate( [ { $match:{ _id:1 } }, { $project:{ _id:0, a:1, b:1, c:1, result:{ $or :[ { $gt:[ "$a", 9 ] }, { $lt:[ "$b", 3 ] }, { $gt:[ "$c", 30 ] } ] } } ])
Resultat:
{ "a" :10, "b" :2, "c" :20, "result" :sand }
I dette tilfælde er resultatet true
, selvom den tredje værdi evalueres til false
.
Et argument
Givet at $or
accepterer et eller flere udtryk, er det muligt at give et enkelt argument.
Eksempel:
db.data.aggregate( [ { $match:{ _id:1 } }, { $project:{ _id:0, a:1, result:{ $or:[ { $gt:[ " $a", 9 ] } ] } } } ])
Resultat:
{ "a" :10, "result" :sand }
Nul-, Null- og Udefinerede værdier
$or
operatør evaluerer 0
, null
og udefineret
som falsk
.
Antag, at vi har følgende dokumenter:
{ "_id" :2, "a" :0, "b" :2 }{ "_id" :3, "a" :10, "b" :0 }{ "_id" :4, "a " :0, "b" :0 }{ "_id" :5, "a" :null, "b" :2 }{ "_id" :6, "a" :10, "b" :null }{ " _id" :7, "a" :null, "b" :null }{ "_id" :8, "a" :undefined, "b" :2 }{ "_id" :9, "a" :10, " b" :undefined }{ "_id" :10, "a" :undefined, "b" :udefineret }
Her er, hvad der sker, når vi anvender $or
:
db.data.aggregate( [ { $match:{ _id:{ $in:[ 2, 3, 4, 5, 6, 7, 8, 9, 10 ] } } }, { $project :{ _id:0, a:1, b:1, result:{ $or:[ "$a", "$b" ] } } } ])
Resultat:
{ "a" :0, "b" :2, "result" :sand }{ "a" :10, "b" :0, "result" :sand }{ "a" :0, "b " :0, "result" :falsk }{ "a" :null, "b" :2, "result" :sand }{ "a" :10, "b" :null, "result" :sand }{ " a" :null, "b" :null, "result" :false }{ "a" :undefined, "b" :2, "result" :sand }{ "a" :10, "b" :undefined, " result" :true }{ "a" :undefined, "b" :undefined, "result" :false }
Her brugte jeg blot feltet som udtryk.
Sådan ser det ud, når vi kun anvender ét argument på de felter, der indeholder 0
, null
og udefineret
:
db.data.aggregate( [ { $match:{ _id:{ $in:[ 4, 7, 10 ] } } }, { $project:{ _id:0, a:1, result:{ $or:[ "$a" ] } } } ])
Resultat:
{ "a" :0, "result" :false }{ "a" :null, "result" :false }{ "a" :undefined, "result" :false }
Alle felter returnerer falsk
.
Kald $or
uden argumenter
Når det påkaldes uden argumenter, vil $or
operatør evaluerer til falsk
.
Eksempel:
db.data.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, result:{ $or:[ ] } } } ])
Resultat:
{ "result" :false }