Estrutura de agregação MongoDB correspondente OU

96

É possível fazer um OR no $ match?

Quero dizer algo assim:

db.articles.aggregate(
    { $or: [ $match : { author : "dave" }, $match : { author : "john" }] }
);
Gergely Németh
fonte

Respostas:

168
$match: { $or: [{ author: 'dave' }, { author: 'john' }] }

Assim, uma vez que o $matchoperador apenas pega o que você normalmente colocaria na find()função

Sammaye
fonte
84

Nesse caso específico, onde você está $orusando o mesmo campo , o $inoperador seria uma escolha melhor, também porque aumenta a legibilidade:

$match: { 
  'author': { 
    $in: ['dave','john'] 
  } 
}

De acordo com os documentos do MongoDB, o uso $iné recomendado neste caso:

$ ou contra $ em

Ao usar $ ou com <expressions> que são verificações de igualdade para o valor do mesmo campo, use o operador $ in em vez do operador $ ou.

https://docs.mongodb.com/manual/reference/operator/query/or/#or-versus-in

Amol M Kulkarni
fonte
1
De acordo com Mongo docs, esta maneira "mais eficaz" de fazer isso para comparações de igualdade, como seu exemplo. Consulte docs.mongodb.org/manual/reference/operator/query/or/#_S_or%22
Mark Gibaud
3
O $ in é o caminho a percorrer
blueskin
1
Eu acredito que $ ou não é um operador de agregação.
Paul Shapiro de
@PaulShapiro: Espero que você não tenha desistido por causa disso. Para todos, por favor, considere comentar o motivo antes de votar contra ele ajuda a todos. Aqui está a referência Operadores de agregação booleana -> $ ou
Amol M Kulkarni
Sua resposta não está correta, e como você pode ver, já comentei explicando onde e como a resposta está incorreta.
Paul Shapiro