MySQL8 中文参考(八十四)(1)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL8 中文参考(八十四)


原文:docs.oracle.com/javase/tutorial/reallybigindex.html

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-find.html

22.4.3.3 查找文档

您可以使用find()方法查询并返回模式中集合中的文档。MySQL Shell 提供额外的方法与find()方法一起使用,以过滤和排序返回的文档。

MySQL 提供以下运算符来指定搜索条件:OR||),AND&&),XORISNOTBETWEENINLIKE!=<>>>=<<=&|<<>>+-*/~%

查找集合中的所有文档

要返回集合中的所有文档,请使用未指定搜索条件的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 第十四章,函数和运算符相同。您必须将所有表达式括在引号中。为简洁起见,一些示例未显示输出。

一个简单的搜索条件可能包括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
        },
    }
]

以下示例搜索所有 GNP 高于 5000 亿美元的国家。countryinfo集合以百万为单位衡量 GNP。

mysql-py> db.countryinfo.find("GNP > 500000")
...[*output removed*]
10 documents in set (0.00 sec)

以下查询中的人口字段嵌入在人口统计对象中。要访问嵌入字段,请在人口统计和人口之间使用句点以确定关系。文档和字段名称区分大小写。

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

以下表达式中的算术运算符用于查询 GNP 人均超过 30000 美元的国家。搜索条件可以包括算术运算符和大多数 MySQL 函数。

注意

countryinfo集合中有七个人口值为零的文档。因此,在输出末尾会出现警告消息。

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()方法将值与搜索条件分离。例如,不要将硬编码的国家名称作为条件,而是用由冒号和以字母开头的名称组成的命名占位符替换。然后使用bind(*占位符*, **)方法如下:

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)
项目结果

您可以返回文档的特定字段,而不是返回所有字段。以下示例返回countryinfo集合中所有文档的 GNP 和 Name 字段,符合搜索条件。

使用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()方法来更改起始文档。例如,要忽略第一个文档并返回符合条件的接下来的八个文档,请将值 1 传递给skip()方法。

mysql-py> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1)
... [*output removed*]
8 documents in set (0.00 sec)
相关信息
  • MySQL 参考手册提供了有关函数和运算符的详细文档。
  • 请查看 CollectionFindFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-modify.html

22.4.3.4 修改文档

您可以使用modify()方法来更新集合中的一个或多个文档。X DevAPI 提供了与modify()方法一起使用的附加方法,以:

  • 设置和取消文档中的字段。
  • 追加、插入和删除数组
  • 绑定、限制和排序要修改的文档。
设置和取消文档字段

modify()方法通过过滤集合以仅包括要修改的文档,然后对这些文档应用您指定的操作来工作。

在以下示例中,modify()方法使用搜索条件标识要更改的文档,然后set()方法替换嵌套的 demographics 对象中的两个值。

mysql-py> db.countryinfo.modify("Code = 'SEA'").set(
"demographics", {"LifeExpectancy": 78, "Population": 28})

修改文档后,请使用find()方法验证更改。

要从文档中删除内容,请使用modify()unset()方法。例如,以下查询从符合搜索条件的文档中删除 GNP。

mysql-py> db.countryinfo.modify("Name = 'Sealand'").unset("GNP")

使用find()方法验证更改。

mysql-py> db.countryinfo.find("Name = 'Sealand'")
{
    "_id": "00005e2ff4af00000000000000f4",
    "Name": "Sealand",
    "Code:": "SEA",
    "IndepYear": 1967,
    "geography": {
        "Region": "British Islands",
        "Continent": "Europe",
        "SurfaceArea": 193
    },
    "government": {
        "HeadOfState": "Michael Bates",
        "GovernmentForm": "Monarchy"
    },
    "demographics": {
        "Population": 27,
        "LifeExpectancy": 79
    }
}
追加、插入和删除数组

要向数组字段追加元素,或者插入、删除数组中的元素,请使用array_append()array_insert()array_delete()方法。以下示例修改countryinfo集合以启用对国际机场的跟踪。

第一个示例使用modify()set()方法在所有文档中创建一个新的 Airports 字段。

注意

在修改文档时没有指定搜索条件时要小心;这样会修改集合中的所有文档。

mysql-py> db.countryinfo.modify("true").set("Airports", [])

添加了 Airports 字段后,下一个示例使用array_append()方法向其中一个文档添加一个新机场。在以下示例中,$.Airports代表当前文档的 Airports 字段。

mysql-py> db.countryinfo.modify("Name = 'France'").array_append("$.Airports", "ORY")

使用find()查看更改。

mysql-py> db.countryinfo.find("Name = 'France'")
{
    "GNP": 1424285,
    "_id": "00005de917d80000000000000048",
    "Code": "FRA",
    "Name": "France",
    "Airports": [
        "ORY"
    ],
    "IndepYear": 843,
    "geography": {
        "Region": "Western Europe",
        "Continent": "Europe",
        "SurfaceArea": 551500
    },
    "government": {
        "HeadOfState": "Jacques Chirac",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 59225700,
        "LifeExpectancy": 78.80000305175781
    }
}

要在数组中的不同位置插入元素,请使用array_insert()方法来指定要在路径表达式中插入的索引。在这种情况下,索引为 0,或者数组中的第一个元素。

mysql-py> db.countryinfo.modify("Name = 'France'").array_insert("$.Airports[0]", "CDG")

要从数组中删除元素,必须将要删除的元素的索引传递给array_delete()方法。

mysql-py> db.countryinfo.modify("Name = 'France'").array_delete("$.Airports[1]")
相关信息
  • MySQL 参考手册提供了帮助您搜索和修改 JSON 值的说明。
  • 请参阅 CollectionModifyFunction 获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-remove.html

22.4.3.5 删除文档

您可以使用remove()方法从模式中的集合中删除一些或所有文档。X DevAPI 提供了额外的方法与remove()方法一起使用,以过滤和排序要删除的文档。

使用条件删除文档

以下示例向remove()方法传递了搜索条件。与条件匹配的所有文档都将从countryinfo集合中删除。在此示例中,有一个文档符合条件。

mysql-py> db.countryinfo.remove("Code = 'SEA'")
删除第一个文档

要删除countryinfo集合中的第一个文档,请使用值为 1 的limit()方法。

mysql-py> db.countryinfo.remove("true").limit(1)
删除订单中的最后一个文档

以下示例通过国家名称删除countryinfo集合中的最后一个文档。

mysql-py> db.countryinfo.remove("true").sort(["Name desc"]).limit(1)
删除集合中的所有文档

您可以删除集合中的所有文档。要这样做,请使用不指定搜索条件的remove("true")方法。

注意

在不指定搜索条件的情况下删除文档时要小心。此操作会从集合中删除所有文档。

或者,使用db.drop_collection('countryinfo')操作删除countryinfo集合。

相关信息
  • 请参阅 CollectionRemoveFunction 获取完整的语法定义。
  • 请参阅 Section 22.4.2,“下载和导入 world_x 数据库”,了解重新创建world_x模式的说明。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-index.html

22.4.3.6 创建和删除索引

索引用于快速查找具有特定字段值的文档。没有索引,MySQL 必须从第一个文档开始,然后逐个读取整个集合以查找相关字段。集合越大,成本就越高。如果集合很大且对特定字段的查询很常见,则考虑在文档内的特定字段上创建索引。

例如,以下查询在 Population 字段上使用索引性能更好:

mysql-py> db.countryinfo.find("demographics.Population < 100")
...[*output removed*]
8 documents in set (0.00 sec)

create_index()方法创建一个索引,您可以使用指定要使用的字段的 JSON 文档进行定义。本节是索引的高级概述。有关更多信息,请参阅索引集合。

添加一个非唯一索引

要创建非唯一索引,请将索引名称和索引信息传递给create_index()方法。禁止重复索引名称。

以下示例指定了一个名为popul的索引,针对demographics对象中的Population字段进行定义,作为Integer数值进行索引。最后一个参数指示字段是否应该需要NOT NULL约束。如果值为false,则该字段可以包含NULL值。索引信息是一个包含一个或多个字段详细信息的 JSON 文档,用于包含在索引中。每个字段定义必须包括字段的完整文档路径,并指定字段的类型。

mysql-py> db.countryinfo.createIndex("popul", {fields:
[{field: '$.demographics.Population', type: 'INTEGER'}]})

在这里,索引使用整数数值创建。还有其他选项可用,包括用于 GeoJSON 数据的选项。您还可以指定索引类型,这里省略了,因为默认类型“index”是合适的。

添加一个唯一索引

要创建唯一索引,请将索引名称、索引定义和索引类型“unique”传递给create_index()方法。此示例显示了在国家名称("Name")上创建的唯一索引,这是countryinfo集合中另一个常见字段进行索引。在索引字段描述中,"TEXT(40)"表示要索引的字符数,"required": True指定该字段必须存在于文档中。

mysql-py> db.countryinfo.create_index("name",
{"fields": [{"field": "$.Name", "type": "TEXT(40)", "required": True}], "unique": True})
删除索引

要删除索引,请将要删除的索引名称传递给drop_index()方法。例如,您可以按如下方式删除“popul”索引:

mysql-py> db.countryinfo.drop_index("popul")
相关信息
  • 有关更多信息,请参阅索引集合。
  • 有关定义索引的更多信息,请参阅定义索引中定义索引的 JSON 文档。
  • 请参阅集合索引管理函数以获取完整的语法定义。


MySQL8 中文参考(八十四)(2)https://developer.aliyun.com/article/1566018

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十三)(3)
MySQL8 中文参考(二十三)
54 4
|
5月前
|
存储 缓存 关系型数据库
MySQL8 中文参考(二十一)(5)
MySQL8 中文参考(二十一)
82 3
|
5月前
|
存储 监控 Java
MySQL8 中文参考(二十一)(4)
MySQL8 中文参考(二十一)
140 3
|
5月前
|
存储 安全 关系型数据库
MySQL8 中文参考(二十一)(1)
MySQL8 中文参考(二十一)
49 3
|
5月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十一)(3)
MySQL8 中文参考(二十一)
72 2
|
5月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十一)(2)
MySQL8 中文参考(二十一)
75 2
|
5月前
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL8 中文参考(二十五)(5)
MySQL8 中文参考(二十五)
49 2
|
5月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十四)(1)
MySQL8 中文参考(二十四)
56 2
|
5月前
|
NoSQL 关系型数据库 MySQL
MySQL8 中文参考(二十三)(2)
MySQL8 中文参考(二十三)
62 2
|
5月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十三)(1)
MySQL8 中文参考(二十三)
37 2