Correspondance du cadre d'agrégation MongoDB OU

96

Est-il possible de faire un OU dans le $ match?

Je veux dire quelque chose comme ça:

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

Réponses:

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

Comme ça, puisque l' $matchopérateur prend juste ce que vous mettriez normalement dans la find()fonction

Sammaye
la source
84

Dans ce cas particulier, où vous $orutilisez le même champ , l' $inopérateur serait un meilleur choix, également parce qu'il augmente la lisibilité:

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

Selon la documentation MongoDB, l'utilisation $inest recommandée dans ce cas:

$ ou contre $ en

Lorsque vous utilisez $ ou avec <expressions> qui sont des vérifications d'égalité pour la valeur du même champ, utilisez l'opérateur $ in au lieu de l'opérateur $ or.

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

Amol M Kulkarni
la source
1
Selon la documentation de Mongo, cette façon «la plus efficace» de le faire pour les comparaisons d'égalité comme votre exemple. Voir docs.mongodb.org/manual/reference/operator/query/or/#_S_or%22
Mark Gibaud
3
Le $ est le chemin à parcourir
blueskin
1
Je crois que $ or n'est pas un opérateur d'agrégation.
Paul Shapiro
@PaulShapiro: J'espère que vous n'avez pas voté pour cette raison. Pour tous, pensez à commenter la raison avant de voter à la baisse, cela aide tout le monde. Voici la référence Boolean Aggregation Operators -> $ or
Amol M Kulkarni
Votre réponse n'est pas correcte, et comme vous pouvez le voir, j'ai déjà commenté en expliquant où et comment la réponse est incorrecte.
Paul Shapiro