$ ou
Nesta página
$or
O operador
$or
executa uma operaçãoOR
lógica em uma array de um ou mais<expressions>
e seleciona os documentos que satisfazem pelo menos uma das<expressions>
.
Compatibilidade
Você pode utilizar o $or
para implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
O operador $or
tem a seguinte sintaxe:
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
Considere o seguinte exemplo:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
Esta query selecionará todos os documentos na collection inventory
onde o valor do campo quantity
é menor que 20
ou o valor do campo price
é igual a 10
.
Comportamentos
$or
Cláusulas e índices
Ao avaliar as cláusulas na expressão $or
, o MongoDB executa uma verificação de collection ou, se todas as cláusulas forem suportadas por índices, o MongoDB executa verificações de índice. Em outras palavras, para que o MongoDB utilize índices para avaliar uma expressão $or
, todas as cláusulas na expressão $or
devem ser suportadas por índices. Caso contrário, o MongoDB realizará uma verificação da coleção.
Quando utilizar índices com queries $or
, cada cláusula de um $or
pode utilizar seu próprio índice. Considere a seguinte query:
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
Para suportar esta query, ao invés de um índice composto, você criaria um índice em quantity
e outro índice em price
:
db.inventory.createIndex( { quantity: 1 } ) db.inventory.createIndex( { price: 1 } )
$or
e queries de text
Se $or
incluir uma query $text
, todas as cláusulas na array $or
deverão ter respaldo de um índice. Isso ocorre porque uma query $text
deve usar um índice, e $or
só pode usar índices se todas as suas sentenças forem suportadas por índices. Se a query $text
não puder utilizar um índice, a query retornará um erro.
Observação
$text
fornece recursos de query de texto para implantações autogerenciadas (não Atlas). Para dados hospedados no MongoDB Atlas, o MongoDB oferece uma solução aprimorada de query de texto completo, Atlas Search.
$or
e queries geoespaciais
$or
suporta cláusulas geoespaciais com a seguinte exceção para a cláusula de proximidade (a cláusula de proximidade inclui $nearSphere
e $near
). $or
não pode conter uma cláusula de proximidade com qualquer outra cláusula.
$or
e operações de ordenação
Quando executar queries $or
com um sort()
, o MongoDB pode utilizar índices que aceitam as cláusulas $or
.
$or
e índices parciais
Você pode criar índices parciais com $or
. Use partialFilterExpression
do método db.collection.createIndex() para criar um índice parcial.
$or
contra $in
Ao utilizar $or
com <expressions>
que são verificações de igualdade para o valor do mesmo campo, use o operador $in
em vez do operador $or
.
Por exemplo, para selecionar todos os documentos na collection inventory
onde o valor do campo quantity
é igual a 20
ou 50
, use o operador $in
:
db.inventory.find ( { quantity: { $in: [20, 50] } } )
Cláusulas $or
agrupadas
Você pode agrupar operações $or
.
Error Handling
Para permitir que o mecanismo de consulta otimize as consultas, o $or
lida com erros como segue:
Se qualquer expressão fornecida para
$or
causar um erro quando avaliada sozinha, o$or
contendo a expressão pode causar um erro, mas um erro não é garantido.Uma expressão fornecida após a primeira expressão fornecida para
$or
pode causar um erro mesmo se a primeira expressão avaliar paratrue
.
Por exemplo, a seguinte consulta sempre produz um erro se $x
for 0
:
db.example.find( { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } )
A consulta a seguir, que contém várias expressões fornecidas para $or
, pode gerar um erro se houver algum documento em que $x
seja 0
:
db.example.find( { $or: [ { x: { $eq: 0 } }, { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } ] } )