Menu Docs
Página inicial do Docs
/ /

$or (operador de predicado de query)

$or

$or executa uma operação OR lógica em uma array de uma ou mais expressões e seleciona documentos que satisfazem pelo menos uma das expressões.

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

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 que 1000.

  • O valor do campo year é anterior a 1910.

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 } ),

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 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
]
}
}
}
]

Quando executar queries $or com um sort(), o MongoDB pode utilizar índices que aceitam as cláusulas $or.

Você pode criar índices parciais com $or. Use partialFilterExpression do método db.collection.createIndex() para criar um índice parcial.

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 }
]

Você pode agrupar operações $or.

Dica

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 para true.

Voltar

$not

Nesta página