22.4.3.3 Поиск документов
Вы можете использовать метод find() для запроса и возврата документов из коллекции в схеме. MySQL Shell предоставляет дополнительные методы для использования с методом find() для фильтрации и сортировки возвращаемых документов.
MySQL предоставляет следующие операторы для указания условий поиска: OR (||), AND (&&), XOR, IS, NOT, BETWEEN, IN, LIKE, !=, <>, >, >=, <, <=, &, |, <<, >>, +, -, *, /, ~ и %.
Поиск всех документов в коллекции
Чтобы вернуть все документы в коллекции, используйте метод find() без указания условий поиска. Например, следующая операция возвращает все документы в коллекции countryinfo.
mysql-py> db.countryinfo.find()
[
{
"GNP": 828,
"Code:": "ABW",
"Name": "Aruba",
"IndepYear": null,
"geography": {
"Continent": "North America",
"Region": "Caribbean",
"SurfaceArea": 193
},
"government": {
"GovernmentForm": "Nonmetropolitan Territory of The Netherlands",
"HeadOfState": "Beatrix"
}
"demographics": {
"LifeExpectancy": 78.4000015258789,
"Population": 103000
},
...
}
]
240 documents in set (0.00 sec)
Метод производит результаты, содержащие операционную информацию помимо всех документов в коллекции.
Пустой набор (нет совпадений документов) возвращает следующую информацию:
Empty set (0.00 sec)
Фильтры поиска
Вы можете включать условия поиска с методом find(). Синтаксис выражений, образующих условие поиска, такой же, как и в традиционном MySQL Главе 14, Функции и операторы. Все выражения должны быть заключены в кавычки. В целях краткости некоторые примеры не отображают вывод.
Простое условие поиска может состоять из поля Name и значения, которое, как известно, находится в документе. Следующий пример возвращает один документ:
mysql-py> db.countryinfo.find("Name = 'Australia'")
[
{
"GNP": 351182,
"Code:": "AUS",
"Name": "Australia",
"IndepYear": 1901,
"geography": {
"Continent": "Oceania",
"Region": "Australia and New Zealand",
"SurfaceArea": 7741220
},
"government": {
"GovernmentForm": "Constitutional Monarchy, Federation",
"HeadOfState": "Elisabeth II"
}
"demographics": {
"LifeExpectancy": 79.80000305175781,
"Population": 18886000
},
}
]
Следующий пример ищет все страны, у которых ВВП выше 500 миллиардов долларов. Коллекция countryinfo измеряет ВВП в единицах миллионов.
mysql-py> db.countryinfo.find("GNP > 500000")
...[output removed]
10 documents in set (0.00 sec)
Поле Population в следующем запросе вложено в объект demographics. Для доступа к вложенному полю используйте точку между demographics и Population для определения связи. Имена документов и полей чувствительны к регистру.
mysql-py> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000")
...[output removed]
6 documents in set (0.00 sec)
Арифметические операторы в следующем выражении используются для поиска стран с ВВП на душу населения выше 30 000 долларов. Условия поиска могут включать арифметические операторы и большинство функций MySQL.
Семь документов в коллекции countryinfo имеют значение поля population равное нулю. Поэтому в конце вывода появляются сообщения об ошибках.
mysql-py> db.countryinfo.find("GNP*1000000/demographics.Population > 30000")
...[output removed]
9 documents in set, 7 warnings (0.00 sec)
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Вы можете отделить значение от условия поиска, используя метод bind(). Например, вместо указания жестко закодированного имени страны в качестве условия замените его именованным плейсхолдером, состоящим из двоеточия, за которым следует имя, начинающееся с буквы, например, country. Затем используйте метод bind( следующим образом: placeholder,
value)
mysql-py> db.countryinfo.find("Name = :country").bind("country", "Italy")
{
"GNP": 1161755,
"_id": "00005de917d8000000000000006a",
"Code": "ITA",
"Name": "Italy",
"Airports": [],
"IndepYear": 1861,
"geography": {
"Region": "Southern Europe",
"Continent": "Europe",
"SurfaceArea": 301316
},
"government": {
"HeadOfState": "Carlo Azeglio Ciampi",
"GovernmentForm": "Republic"
},
"demographics": {
"Population": 57680000,
"LifeExpectancy": 79
}
}
1 document in set (0.01 sec)
В программе привязка позволяет указывать плейсхолдеры в ваших выражениях, которые заполняются значениями перед выполнением и могут использовать автоматическое экранирование, если это необходимо.
Всегда используйте привязку для очистки входных данных. Избегайте введения значений в запросы с помощью конкатенации строк, что может привести к некорректным входным данным и, в некоторых случаях, к проблемам безопасности.
Вы можете использовать плейсхолдеры и метод bind() для создания сохраненных запросов, которые затем можно вызывать с различными значениями. Например, для создания сохраненного запроса для страны:
mysql-py> myFind = db.countryinfo.find("Name = :country")
mysql-py> myFind.bind('country', 'France')
{
"GNP": 1424285,
"_id": "00005de917d80000000000000048",
"Code": "FRA",
"Name": "France",
"IndepYear": 843,
"geography": {
"Region": "Western Europe",
"Continent": "Europe",
"SurfaceArea": 551500
},
"government": {
"HeadOfState": "Jacques Chirac",
"GovernmentForm": "Republic"
},
"demographics": {
"Population": 59225700,
"LifeExpectancy": 78.80000305175781
}
}
1 document in set (0.0028 sec)
mysql-py> myFind.bind('country', 'Germany')
{
"GNP": 2133367,
"_id": "00005de917d80000000000000038",
"Code": "DEU",
"Name": "Germany",
"IndepYear": 1955,
"geography": {
"Region": "Western Europe",
"Continent": "Europe",
"SurfaceArea": 357022
},
"government": {
"HeadOfState": "Johannes Rau",
"GovernmentForm": "Federal Republic"
},
"demographics": {
"Population": 82164700,
"LifeExpectancy": 77.4000015258789
}
}
1 document in set (0.0026 sec)
Проектирование результатов
Вы можете возвращать определенные поля документа вместо возвращения всех полей. Следующий пример возвращает поля GNP и Name всех документов в коллекции countryinfo, соответствующих условиям поиска.
Используйте метод fields() для передачи списка полей для возврата.
mysql-py> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"])
[
{
"GNP": 8510700,
"Name": "United States"
}
]
1 document in set (0.00 sec)
Кроме того, вы можете изменять возвращаемые документы — добавлять, переименовывать, вкладывать и даже вычислять новые значения полей — с помощью выражения, описывающего возвращаемый документ. Например, измените имена полей с помощью следующего выражения, чтобы вернуть только два документа.
mysql-py> db.countryinfo.find().fields(
mysqlx.expr('{"Name": upper(Name), "GNPPerCapita": GNP*1000000/demographics.Population}')).limit(2)
{
"Name": "ARUBA",
"GNPPerCapita": 8038.834951456311
}
{
"Name": "AFGHANISTAN",
"GNPPerCapita": 263.0281690140845
}
Ограничение, сортировка и пропуск результатов
Вы можете применять методы limit(), sort() и skip() для управления количеством и порядком документов, возвращаемых методом find().
Чтобы указать количество документов, включенных в результат, добавьте метод limit() со значением к методу find(). Следующий запрос возвращает первые пять документов в коллекции countryinfo.
mysql-py> db.countryinfo.find().limit(5)
... [output removed]
5 documents in set (0.00 sec)
Чтобы указать порядок результатов, добавьте метод sort() к методу find(). Передайте методу sort() список из одного или нескольких полей для сортировки и, необязательно, атрибут убывания (desc) или возрастания (asc) по мере необходимости. По умолчанию порядок сортировки — возрастание.
Например, следующий запрос сортирует все документы по полю IndepYear и затем возвращает первые восемь документов в порядке убывания.
mysql-py> db.countryinfo.find().sort(["IndepYear desc"]).limit(8)
... [output removed]
8 documents in set (0.00 sec)
По умолчанию метод limit() начинается с первого документа в коллекции. Вы можете использовать метод skip() для изменения стартового документа. Например, чтобы пропустить первый документ и вернуть следующие восемь документов, соответствующих условию, передайте методу skip() значение 1.
mysql-py> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1)
... [output removed]
8 documents in set (0.00 sec)
Связанная информация
В Справочном руководстве по MySQL предоставлены подробные сведения о функциях и операторах.
См. для полного определения синтаксиса.
© 2025 Oracle
Licensed under the GPLv2 License.