Соответствие фреймворка агрегации MongoDB ИЛИ

96

Можно ли выполнить операцию ИЛИ в $ match?

Я имею в виду что-то вроде этого:

db.articles.aggregate(
    { $or: [ $match : { author : "dave" }, $match : { author : "john" }] }
);
Гергей Немет
источник

Ответы:

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

Так, поскольку $matchоператор просто берет то, что вы обычно помещаете в find()функцию

Sammaye
источник
85

В данном конкретном случае, когда вы $or-ный то же поле , то $inоператор будет лучшим выбором, а также потому , что она увеличивает читаемость:

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

Согласно документации MongoDB, $inв этом случае рекомендуется использовать :

$ или против $ в

При использовании $ или с <expressions>, которые проверяют равенство значения одного и того же поля, используйте оператор $ in вместо оператора $ or.

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

Амол М Кулкарни
источник
1
Согласно документам Mongo, это «наиболее эффективный» способ сделать это для сравнений на равенство, таких как ваш пример. См. Docs.mongodb.org/manual/reference/operator/query/or/#_S_or%22
Марк Жибо,
3
$
In
1
Я считаю, что $ or не является оператором агрегирования.
Пол Шапиро
@PaulShapiro: Надеюсь, вы не проголосовали против этого. Для всех, пожалуйста, подумайте о том, чтобы прокомментировать причину, прежде чем голосовать против, это поможет всем. Вот ссылка на логические операторы агрегации -> $ или
Amol M Kulkarni
Ваш ответ неправильный, и, как видите, я уже прокомментировал, объясняя, где и как ответ неправильный.
Пол Шапиро