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" }] }
);

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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.