$or$orexecuta uma operaçãoORlógica em uma array de uma ou mais expressões e seleciona documentos que satisfazem pelo menos uma das expressões.
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> } ] }
Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Considere o seguinte exemplo:
db.movies.find( { $or: [ { runtime: { $gt: 1000 } }, { year: { $lt: 1910 } } ] }, { _id: 0, title: 1, year: 1, runtime: 1 } )
[ { runtime: 11, title: 'The Great Train Robbery', year: 1903 }, { runtime: 14, title: 'A Corner in Wheat', year: 1909 }, { runtime: 1256, title: 'Centennial', year: 1978 }, { runtime: 1140, title: 'Baseball', year: 1994 }, { runtime: 1, title: 'The Kiss', year: 1896 }, { runtime: 1, title: 'The Kiss', year: 1896 } ]
Esta query seleciona todos os documentos na coleção movies que atendem a uma das seguintes condições:
O valor do campo
runtimeé maior que1000.O valor do campo
yearé anterior a1910.
Comportamentos
$or Cláusulas e índices
Ao avaliar as cláusulas na expressão$or, o MongoDB realiza uma varredura de coleção ou uma varredura de índice. Se todas as cláusulas forem compatíveis com índices, o MongoDB realiza varreduras de índice. Para usar índices para avaliar uma expressão$or, todas as cláusulas da expressão$or devem ser compatíveis com índices. Caso contrário, o MongoDB realiza uma varredura de coleção.
Quando utilizar índices com queries $or, cada cláusula de um $or pode utilizar seu próprio índice. Considere esta query:
db.movies.find( { $or: [ { runtime: { $gt: 1000 } }, { year: { $lt: 1910 } } ] } )
Para suportar esta consulta, crie um índice em runtime e outro índice em year, ao invés de um índice composto:
db.movies.createIndex( { runtime: 1 } ), db.movies.createIndex( { year: 1 } ),
$or e text queries
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 compatíveis com índices. Se a $text query não puder usar um índice, ela 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.
A query a seguir é válida porque $or utiliza um termo geoespacial não próximo ($geoIntersects):
db.theaters.find( { $or: [ { "location.geo": { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [ [ [ -74.5, 40.5 ], [ -73.5, 40.5 ], [ -73.5, 41.0 ], [ -74.5, 40.5 ] ] ] } } } }, { "location.address.state": "NY" } ] } )
[ { _id: ObjectId('59a47287cfa9a3a73e51e92f'), theaterId: 200, location: { address: { street1: '3124 Jericho Tpke', city: 'East Northport', state: 'NY', zipcode: '11731' }, geo: { type: 'Point', coordinates: [ -73.319092, 40.838463 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51ead6'), theaterId: 345, location: { address: { street1: '148 Walt Whitman Rd', city: 'Huntington Station', state: 'NY', zipcode: '11746' }, geo: { type: 'Point', coordinates: [ -73.410637, 40.825775 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eae8'), theaterId: 374, location: { address: { street1: '2478 Central Park Ave', city: 'Yonkers', state: 'NY', zipcode: '10710' }, geo: { type: 'Point', coordinates: [ -73.826805, 40.983246 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eafd'), theaterId: 384, location: { address: { street1: '40 Catherwood Road', city: 'Ithaca', state: 'NY', zipcode: '14850' }, geo: { type: 'Point', coordinates: [ -76.492142, 42.481991 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eb2c'), theaterId: 428, location: { address: { street1: '1 Crossgates Mall Rd', city: 'Albany', state: 'NY', zipcode: '12203' }, geo: { type: 'Point', coordinates: [ -73.848686, 42.690285 ] } } } ]
$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 Comparado com $in
Se você usar $or com <expressions> que são verificações de igualdade para o valor do mesmo campo, use $in em vez de $or.
Esta query seleciona documentos na coleção movies em que year é 1903 ou 1909:
db.movies.find( { year: { $in: [1903, 1909] } }, { _id: 0, title: 1, year: 1 } )
[ { title: 'The Great Train Robbery', year: 1903 }, { title: 'A Corner in Wheat', year: 1909 } ]
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.