Spec-Zone.ru › MySQL 9.2

22.3.3.3 Нахождение документов

Вы можете использовать метод find() для запроса и возврата документов из коллекции в схеме. MySQL Shell предоставляет дополнительные методы для использования с методом find() для фильтрации и сортировки возвращаемых документов.

MySQL предоставляет следующие операторы для указания условий поиска: OR (||), AND (&&), XOR, IS, NOT, BETWEEN, IN, LIKE, !=, <>, >, >=, <, <=, &, |, <<, >>, +, -, *, /, ~ и %.

Поиск всех документов в коллекции

Чтобы вернуть все документы в коллекции, используйте метод find() без указания условий поиска. Например, следующая операция возвращает все документы в коллекции countryinfo.

mysql-js> 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-js> 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-js> db.countryinfo.find("GNP > 500000")
...[output removed]
10 documents in set (0.00 sec)

Поле Population в следующем запросе вложено в объект demographics. Для доступа к вложенному полю используйте точку между demographics и Population, чтобы определить отношение. Имена документов и полей чувствительны к регистру.

mysql-js> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000")
...[output removed]
6 documents in set (0.00 sec)

Арифметические операторы в следующем выражении используются для поиска стран с ВВП на душу населения выше 30 000 долларов. Условия поиска могут включать арифметические операторы и большинство функций MySQL.

Примечание

Семь документов в коллекции countryinfo имеют значение population, равное нулю. Поэтому в конце вывода появляются сообщения об ошибке.

mysql-js> 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-js> 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-js> var myFind = db.countryinfo.find("Name = :country")
mysql-js> 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-js> 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-js> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"])
[
    {
        "GNP": 8510700,
        "Name": "United States"
    }
]
1 document in set (0.00 sec)
 

Кроме того, вы можете изменить возвращаемые документы — добавив, переименовав, вложив и даже вычислив новые значения полей — с помощью выражения, описывающего возвращаемый документ. Например, измените имена полей с помощью следующего выражения, чтобы вернуть только два документа.

mysql-js> 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-js> db.countryinfo.find().limit(5)
... [output removed]
5 documents in set (0.00 sec)

Чтобы указать порядок результатов, добавьте метод sort() к методу find(). Передайте методу sort() список одного или нескольких полей для сортировки и, необязательно, атрибут убывания (desc) или возрастания (asc), как необходимо. Порядок возрастания — это порядок по умолчанию.

Например, следующий запрос сортирует все документы по полю IndepYear и затем возвращает первые восемь документов в порядке убывания.

mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8)
... [output removed]
8 documents in set (0.00 sec)

По умолчанию метод limit() начинается с первого документа в коллекции. Вы можете использовать метод skip() для изменения начального документа. Например, чтобы пропустить первый документ и вернуть следующие восемь документов, соответствующих условию, передайте методу skip() значение 1.

mysql-js> 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/mysql-shell-tutorial-javascript-documents-find.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API