El marco de agregación de MongoDB coincide con OR

96

¿Es posible hacer un OR en el $ match?

Me refiero a algo como esto:

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

Respuestas:

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

Así, dado que el $matchoperador solo toma lo que normalmente pondría en la find()función

Sammaye
fuente
84

En este caso particular, donde está $or-ing el mismo campo , el $inoperador sería una mejor opción, también porque aumenta la legibilidad:

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

De acuerdo con los documentos de MongoDB, $inse recomienda usar en este caso:

$ o contra $ en

Cuando use $ o con <expresiones> que son verificaciones de igualdad para el valor del mismo campo, use el operador $ in en lugar del operador $ or.

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

Amol M Kulkarni
fuente
1
Según los documentos de Mongo, esta forma "más eficaz" de hacerlo para las comparaciones de igualdad, como su ejemplo. Ver docs.mongodb.org/manual/reference/operator/query/or/#_S_or%22
Mark Gibaud
3
The $ in es el camino a seguir
blueskin
1
Creo que $ or no es un operador de agregación.
Paul Shapiro
@PaulShapiro: Espero que no hayas votado en contra por esto. Para todos, considere comentar la razón antes de votar en contra, esto ayuda a todos. Aquí está la referencia Operadores de agregación booleana -> $ o
Amol M Kulkarni
Tu respuesta no es correcta, y como puedes ver, ya comenté explicando dónde y cómo la respuesta es incorrecta.
Paul Shapiro