Критерии запроса¶
Запросы могут выходить за рамки точного соответствия, описанного в предыдущем разделе; они могут соответствовать более сложным критериям, таким как диапазоны, операторы OR и отрицание.
Условные операторы¶
"$lt", "$lte", "$gt" и "$gte" – все это операторы сравнения, соответствующие <, <=, > и >= соответственно. Их можно комбинировать для поиска диапазона значений. Например, чтобы найти пользователей в возрасте от 18 до 30 лет, можно выполнить следующий запрос:
1 | |
При этом будут найдены все документы, где поле age было больше или равно 18 и меньше или равно 30.
Эти типы запросов диапазона часто полезны, когда речь идет о датах. Например, чтобы найти людей, которые зарегистрировались до 1 января 2007 года, можно выполнить следующий запрос:
1 2 | |
В зависимости от того, как вы создаете и храните даты, точное совпадение может быть менее полезным, поскольку даты хранятся с точностью до миллисекунды. Часто вам требуется целый день, неделя или месяц, что делает необходимым запрос по диапазону.
Чтобы запросить документы, в которых значение ключа не равно определенному значению, нужно использовать другой условный оператор $ne, который означает «не равно». Если вы хотите найти всех пользователей, у которых нет имени «joe», можно запросить их таким образом:
1 | |
Оператор $ne можно использовать с любым типом.
Запросы с оператором OR¶
В MongoDB есть два способа выполнить запрос оператором OR. Оператор $in может использоваться для запроса различных значений для одного ключа. Оператор $or является более общим; его можно использовать для запроса любого из заданных значений по нескольким ключам.
Если у вас имеется более одного возможного значения для одного ключа, используйте массив критериев с $in. Например, предположим, что мы проводим розыгрыш и номера выигрышных билетов – 75, 542 и 390. Чтобы найти все три этих документа, можно создать следующий запрос:
1 | |
Оператор $in очень гибкий и позволяет указывать критерии различных типов, а также значения. Например, если мы постепенно переносим нашу схему, чтобы использовать имена пользователей вместо идентификаторов пользователей, можно запросить любой из них:
1 | |
Этот запрос сопоставляет документы, где user_id равен 12 345, и документы, где user_id имеет значение joe.
Если оператору $in задан массив с одним значением, он ведет себя так же, как и прямое сопоставление со значением. Например, {ticket_no: {$in: [725]}} совпадает с теми же документами, что и {ticket_no: 725}.
Противоположностью оператору $in является оператор $nin, который возвращает документы, которые не соответствуют ни одному из критериев в массиве. Если мы хотим вернуть всех тех, кто ничего не выиграл во время лотереи, это можно сделать с помощью следующего запроса:
1 | |
Этот запрос возвращает всех, у кого не было билетов с этими номерами. Оператор $in дает вам запрос OR для одного ключа, но что, если нам нужно найти документы, где ticket_no равен 725 или значение winner равно true? Для этого типа запроса нам понадобится использовать условный оператор $or. $or принимает массив возможных критериев. В случае с лотереей использование оператора $or будет выглядеть так:
1 | |
$or может содержать другие условия. Если, например, мы хотим сопоставить любое из трех значений ticket_no или ключ winner, можно использовать это:
1 2 3 4 | |
С помощью обычного запроса типа AND вы хотите максимально сузить результаты, используя как можно меньше аргументов. Запросы типа OR действуют наоборот: они наиболее эффективны, если первые аргументы соответствуют как можно большему количеству документов.
Хотя оператор $or будет работать, всегда, когда это возможно, используйте $in, поскольку оптимизатор запросов обрабатывает его более эффективно.
$not¶
$not является метаусловным оператором: его можно применять поверх любых других критериев. В качестве примера давайте рассмотрим оператор модуля $mod. $mod запрашивает ключи, значения которых при делении на первое заданное значение имеют остаток от второго значения:
1 | |
Предыдущий запрос возвращает пользователей с номерами 1, 6, 11, 16 и т. д. Если вместо этого мы хотим вернуть пользователей с номерами 2, 3, 4, 5, 7, 8, 9, 10, 12 и т. д., можно использовать оператор $not:
1 | |
$not может быть особенно полезен в сочетании с регулярными выражениями для поиска всех документов, которые не соответствуют заданному шаблону (использование регулярных выражений описано в разделе «Регулярные выражения»).