Spec-Zone.ru › MySQL 8.4

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-8.4-en/mysql-shell-tutorial-javascript-documents-find.html

Spec-Zone.ru

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