$orO operador
$orexecuta uma operação lógicaORem uma array de uma 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 } )
O MongoDB pode usar todos, exceto o índice geoHaystack , para suportar cláusulas $or .
$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 oferece suporte a termos geoespaciais. No entanto, se você usar um termo próximo ($near ou $nearSphere), o $or não pode conter outro termo. O uso do $or com um único termo fornece o mesmo resultado que ao omitir o operador $or.
Por exemplo, a seguinte consulta é inválida porque o operador $or combina $near com outra cláusula:
db.places.find( { $or: [ { location: { $near: [ 40, 5 ] } }, { category: "restaurant" } ] } )
A query a seguir é válida porque $or utiliza um termo geoespacial não próximo ($geoIntersects):
db.places.find( { $or: [ { location: { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [ [ [ 39, 4 ], [ 41, 4 ], [ 41, 6 ], [ 39, 4 ] ] ] } } } }, { category: "restaurant" } ] } )
$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
$orcausar um erro quando avaliada sozinha, o$orcontendo 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
$orpode 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 ] } } ] } )