MySQL8 中文参考(八十三)(4)https://developer.aliyun.com/article/1565959
22.3.5 表中的文档
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-in-tables.html
在 MySQL 中,表可以包含传统的关系数据、JSON 值或两者兼有。您可以通过将文档存储在具有本机JSON
数据类型的列中,将传统数据与 JSON 文档结合起来。
本节示例使用world_x
模式中的 city 表。
city 表描述
city 表有五列(或字段)。
+---------------+------------+-------+-------+---------+------------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------+-------+-------+---------+------------------+ | ID | int(11) | NO | PRI | null | auto_increment | | Name | char(35) | NO | | | | | CountryCode | char(3) | NO | | | | | District | char(20) | NO | | | | | Info | json | YES | | null | | +---------------+------------+-------+-------+---------+------------------+
插入一条记录
要将文档插入到表的列中,请按正确顺序向values()
方法传递一个格式良好的 JSON 文档。在下面的示例中,一个文档作为最终值传递到 Info 列中以进行插入。
mysql-js> db.city.insert().values( None, "San Francisco", "USA", "California", '{"Population":830000}')
选择一条记录
您可以发出带有评估表达式中文档值的搜索条件的查询。
mysql-js> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).where( "CountryCode = :country and Info->'$.Population' > 1000000").bind( 'country', 'USA') +------+----------------+-------------+----------------+-----------------------------+ | ID | Name | CountryCode | District | Info | +------+----------------+-------------+----------------+-----------------------------+ | 3793 | New York | USA | New York | {"Population": 8008278} | | 3794 | Los Angeles | USA | California | {"Population": 3694820} | | 3795 | Chicago | USA | Illinois | {"Population": 2896016} | | 3796 | Houston | USA | Texas | {"Population": 1953631} | | 3797 | Philadelphia | USA | Pennsylvania | {"Population": 1517550} | | 3798 | Phoenix | USA | Arizona | {"Population": 1321045} | | 3799 | San Diego | USA | California | {"Population": 1223400} | | 3800 | Dallas | USA | Texas | {"Population": 1188580} | | 3801 | San Antonio | USA | Texas | {"Population": 1144646} | +------+----------------+-------------+----------------+-----------------------------+ 9 rows in set (0.01 sec)
相关信息
- 有关更多信息,请参阅与关系表和文档一起工作。
- 有关数据类型的详细描述,请参阅第 13.5 节,“JSON 数据类型”。
22.4 Python 快速入门指南:MySQL Shell 用于文档存储
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python.html
22.4.1 MySQL Shell
22.4.2 下载和导入 world_x 数据库
22.4.3 文档和集合
22.4.4 关系表
22.4.5 表中的文档
本快速入门指南提供了使用 MySQL Shell 与文档存储应用程序进行交互原型设计的说明。该指南包括以下主题:
- MySQL 功能、MySQL Shell 和
world_x
示例模式的简介。 - 管理集合和文档的操作。
- 管理关系表的操作。
- 适用于表中文档的操作。
要按照这个快速入门指南,您需要安装了 X 插件的 MySQL 服务器,默认情况下在 8.0 版本中,以及用作客户端的 MySQL Shell。MySQL Shell 包括 X DevAPI,它在 JavaScript 和 Python 中都有实现,使您能够使用 X 协议连接到 MySQL 服务器实例,并将服务器用作文档存储。
相关信息
- MySQL Shell 8.0 提供了有关 MySQL Shell 的更深入信息。
- 有关本快速入门指南中使用的工具的更多信息,请参阅安装 MySQL Shell 和第 22.5 节,“X 插件”。
- 有关 MySQL Shell 支持的语言的更多信息,请参阅支持的语言。
- X DevAPI 用户指南提供了更多使用 X DevAPI 开发使用 MySQL 作为文档存储的应用程序的示例。
- 还提供了一个 JavaScript 快速入门指南。
22.4.1 MySQL Shell
译文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-shell.html
本快速入门指南假定您对 MySQL Shell 有一定的熟悉度。以下部分是一个高级概述,请参阅 MySQL Shell 文档以获取更多信息。MySQL Shell 是到 MySQL 服务器的统一脚本接口。它支持 JavaScript 和 Python 脚本。JavaScript 是默认处理模式。
启动 MySQL Shell
安装并启动 MySQL 服务器后,将 MySQL Shell 连接到服务器实例。您需要知道要连接的 MySQL 服务器实例的地址。为了能够将实例用作文档存储,服务器实例必须安装 X 插件,并且您应该使用 X 协议连接到服务器。例如,要连接到默认 X 协议端口 33060 上的实例 ds1.example.com
,请使用网络字符串 *
user*@ds1.example.com:33060
。
提示
如果您使用经典的 MySQL 协议连接到实例,例如使用默认的port
3306 而不是mysqlx_port
,则无法使用本教程中显示的文档存储功能。例如,db
全局对象未填充。要使用文档存储,始终使用 X 协议连接。
如果 MySQL Shell 尚未运行,请打开终端窗口并输入:
mysqlsh *user*@ds1.example.com:33060/world_x
或者,如果 MySQL Shell 已经在运行,请使用\connect
命令:
\connect *user*@ds1.example.com:33060/world_x
您需要指定要连接到的 MySQL 服务器实例的地址。例如,在上一个示例中:
- *
user
*代表您的 MySQL 帐户的用户名。 ds1.example.com
是运行 MySQL 的服务器实例的主机名。请将其替换为您正在使用作为文档存储的 MySQL 服务器实例的主机名。- 本会话的默认模式为
world_x
。有关设置world_x
模式的说明,请参见第 22.4.2 节,“下载和导入 world_x 数据库”。
有关更多信息,请参见第 6.2.5 节,“使用类似 URI 字符串或键值对连接到服务器”。
当 MySQL Shell 打开时,mysql-js>
提示表示此会话的活动语言为 JavaScript。要将 MySQL Shell 切换到 Python 模式,请使用\py
命令。
mysql-js> \py Switching to Python mode... mysql-py>
MySQL Shell 支持输入行编辑如下:
- 左箭头和右箭头键在当前输入行内水平移动。
- 上箭头和下箭头键在先前输入的行集中上下移动。
- Backspace删除光标前的字符,并输入新字符以在光标位置输入它们。
- Enter将当前输入行发送到服务器。
获取 MySQL Shell 帮助
在命令解释器提示符处键入mysqlsh --help以获取命令行选项列表。
mysqlsh --help
在 MySQL Shell 提示符处键入\help
以获取可用命令及其描述的列表。
mysql-py> \help
在命令后键入\help
,可获取有关单个 MySQL Shell 命令的详细帮助。例如,要查看\connect
命令的帮助,请执行以下操作:
mysql-py> \help \connect
退出 MySQL Shell
要退出 MySQL Shell,请执行以下命令:
mysql-py> \quit
相关信息
- 查看交互式代码执行以了解 MySQL Shell 中交互式代码执行的工作原理。
- 查看使用 MySQL Shell 入门以了解会话和连接选项。
22.4.2 下载并导入 world_x 数据库
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-download.html
作为快速入门指南的一部分,提供了一个示例模式,称为world_x
模式。许多示例演示了使用此模式的文档存储功能。启动您的 MySQL 服务器以加载world_x
模式,然后按照以下步骤操作:
- 下载world_x-db.zip。
- 将安装归档文件提取到临时位置,如
/tmp/
。解压缩归档文件会生成一个名为world_x.sql
的单个文件。 - 将
world_x.sql
文件导入到您的服务器。您可以选择:
- 在 SQL 模式下启动 MySQL Shell,并通过以下方式导入文件:
mysqlsh -u root --sql --file /tmp/world_x-db/world_x.sql Enter password: ****
- 在运行时将 MySQL Shell 设置为 SQL 模式,并通过以下方式源化模式文件:
\sql Switching to SQL mode... Commands end with ; \source /tmp/world_x-db/world_x.sql
- 将
/tmp/
替换为您系统上world_x.sql
文件的路径。如果提示,请输入密码。只要账户有权限创建新模式,非 root 账户也可以使用。
world_x 模式
world_x
示例模式包含以下 JSON 集合和关系表:
- 集合
countryinfo
:世界各国的信息。
- 表
country
:世界各国的最少信息。city
:这些国家中一些城市的信息。countrylanguage
:每个国家使用的语言。
相关信息
- MySQL Shell 会话解释了会话类型。
22.4.3 文档和集合
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-collections.html
22.4.3.1 创建、列出和删除集合
22.4.3.2 使用集合
22.4.3.3 查找文档
22.4.3.4 修改文档
22.4.3.5 删除文档
22.4.3.6 创建和删除索引
当您将 MySQL 用作文档存储时,集合是您可以创建、列出和删除的模式内的容器。集合包含您可以添加、查找、更新和删除的 JSON 文档。
本节示例使用world_x
模式中的countryinfo
集合。有关设置world_x
模式的说明,请参见第 22.4.2 节,“下载和导入 world_x 数据库”。
文档
在 MySQL 中,文档被表示为 JSON 对象。在内部,它们以一种高效的二进制格式存储,可以实现快速查找和更新。
- Python 的简单文档格式:
{"field1": "value", "field2" : 10, "field 3": null}
一组文档由一组由逗号分隔并包含在[
和]
字符中的文档组成。
- Python 的简单文档数组:
[{"Name": "Aruba", "Code:": "ABW"}, {"Name": "Angola", "Code:": "AGO"}]
MySQL 支持 JSON 文档中以下 Python 值类型:
- 数字(整数和浮点数)
- 字符串
- 布尔值(False 和 True)
- 无
- 更多 JSON 值的数组
- 更多 JSON 值的嵌套(或嵌入)对象
集合
集合是共享目的并可能共享一个或多个索引的文档的容器。每个集合都有一个唯一的名称,并存在于单个模式中。
术语模式等同于数据库,意味着一组数据库对象,而不是用于强制数据结构和约束的关系模式。模式不会对集合中的文档强制一致性。
在这个快速入门指南中:
- 基本对象包括:
对象形式 | 描述 |
db |
db 是分配给当前活动模式的全局变量。当您想对模式运行操作时,例如检索集合,您可以使用db 变量可用的方法。 |
db.get_collections() |
db.get_collections() 返回模式中集合的列表。使用列表获取对集合对象的引用,对其进行迭代等。 |
- 由集合范围内的基本操作包括:
操作形式 | 描述 |
db.* name*.add() |
add() 方法将一个或多个文档插入到指定集合中。 |
db.* name*.find() |
find() 方法返回指定集合中的一些或所有文档。 |
db.* name*.modify() |
modify() 方法更新指定集合中的文档。 |
db.* name*.remove() |
remove() 方法从指定集合中删除一个或多个文档。 |
相关信息
- 查看操作集合以获取一般概述。
- CRUD EBNF 定义 提供了操作的完整列表。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-collections-operations.html
22.4.3.1 创建、列出和删除集合
在 MySQL Shell 中,您可以创建新集合,在模式中获取现有集合的列表,并从模式中删除现有集合。集合名称区分大小写,每个集合名称必须是唯一的。
确认模式
要显示分配给模式变量的值,请执行:
mysql-py> db
如果模式值不是Schema:world_x
,则通过执行以下命令设置db
变量:
mysql-py> \use world_x
创建一个集合
要在现有模式中创建新集合,请使用db
对象的createCollection()
方法。以下示例在world_x
模式中创建一个名为flags
的集合。
mysql-py> db.create_collection("flags")
该方法返回一个集合对象。
<Collection:flags>
列出集合
要显示world_x
模式中的所有集合,请使用db
对象的get_collections()
方法。当前连接到的服务器返回的集合将显示在括号之间。
mysql-py> db.get_collections() [ <Collection:countryinfo>, <Collection:flags> ]
删除一个集合
要从模式中删除现有集合,请使用db
对象的drop_collection()
方法。例如,要从当前模式中删除flags
集合,请执行:
mysql-py> db.drop_collection("flags")
drop_collection()
方法也可用于在 MySQL Shell 中从模式中删除关系表。
相关信息
- 查看集合对象以获取更多示例。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-add.html
22.4.3.2 处理集合
要处理模式中的集合,请使用db
全局对象访问当前模式。在此示例中,我们使用之前导入的world_x
模式和countryinfo
集合。因此,您发出的操作的格式是db.*
collection_name*.operation
,其中*collection_name
*是执行操作的集合的名称。在以下示例中,操作是针对countryinfo
集合执行的。
添加文档
使用add()
方法将一个文档或文档列表插入到现有集合中。将以下文档插入到countryinfo
集合中。由于这是多行内容,请按两次Enter键以插入文档。
mysql-py> db.countryinfo.add( { "GNP": .6, "IndepYear": 1967, "Name": "Sealand", "Code:": "SEA", "demographics": { "LifeExpectancy": 79, "Population": 27 }, "geography": { "Continent": "Europe", "Region": "British Islands", "SurfaceArea": 193 }, "government": { "GovernmentForm": "Monarchy", "HeadOfState": "Michael Bates" } } )
该方法返回操作的状态。您可以通过搜索文档来验证操作。例如:
mysql-py> db.countryinfo.find("Name = 'Sealand'") { "GNP": 0.6, "_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 } }
请注意,除了在添加文档时指定的字段之外,还有一个字段,即_id
。每个文档都需要一个名为_id
的标识符字段。_id
字段的值在同一集合中的所有文档中必须是唯一的。在 MySQL 8.0.11 及更高版本中,文档 ID 是由服务器生成的,而不是客户端,因此 MySQL Shell 不会自动设置_id
值。如果文档不包含_id
字段,MySQL 8.0.11 或更高版本的服务器会设置_id
值。在较早的 8.0 版本或 5.7 版本的 MySQL 服务器中,在这种情况下不会设置_id
值,因此您必须明确指定。如果不指定,MySQL Shell 将返回错误 5115 文档缺少必需字段。更多信息请参见理解文档 ID。
相关信息
- 请查看 CollectionAddFunction 以获取完整的语法定义。
- 请查看理解文档 ID。