MySQL8 中文参考(八十三)(1)https://developer.aliyun.com/article/1565955
22.3.2 下载并导入 world_x 数据库
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-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.3.3 文档和集合
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-collections.html
22.3.3.1 创建、列出和删除集合
22.3.3.2 使用集合
22.3.3.3 查找文档
22.3.3.4 修改文档
22.3.3.5 删除文档
22.3.3.6 创建和删除索引
当您将 MySQL 用作文档存储时,集合是模式内的容器,您可以创建、列出和删除。集合包含您可以添加、查找、更新和删除的 JSON 文档。
本节示例使用world_x
模式中的countryinfo
集合。有关设置world_x
模式的说明,请参见第 22.3.2 节,“下载和导入 world_x 数据库”。
文档
在 MySQL 中,文档被表示为 JSON 对象。在内部,它们以一种高效的二进制格式存储,可以实现快速查找和更新。
- JavaScript 的简单文档格式:
{field1: "value", field2 : 10, "field 3": null}
一个文档数组由一组由逗号分隔并包含在[
和]
字符中的文档组成。
- JavaScript 的简单文档数组:
[{"Name": "Aruba", "Code:": "ABW"}, {"Name": "Angola", "Code:": "AGO"}]
MySQL 支持 JSON 文档中的以下 JavaScript 值类型:
- 数字(整数和浮点数)
- 字符串
- 布尔值(False 和 True)
- null
- 更多 JSON 值的数组
- 更多 JSON 值的嵌套(或嵌入)对象
集合
集合是用于共享目的和可能共享一个或多个索引的文档的容器。每个集合都有一个唯一的名称,并存在于单个模式中。
术语模式等同于数据库,意味着一组数据库对象,而不是用于强制数据结构和约束的关系模式。模式不会对集合中的文档强制执行一致性。
在这个快速入门指南中:
- 基本对象包括:
对象形式 | 描述 |
db |
db 是分配给当前活动模式的全局变量。当您想对模式运行操作时,例如检索集合,您可以使用db 变量可用的方法。 |
db.getCollections() |
db.getCollections() 返回模式中集合的列表。使用列表获取对集合对象的引用,对其进行迭代等。 |
- 由集合范围的基本操作包括:
操作形式 | 描述 |
db.* name*.add() |
add() 方法将一个或多个文档插入到指定集合中。 |
db.* name*.find() |
find() 方法返回指定集合中的一些或所有文档。 |
db.* name*.modify() |
modify() 方法更新指定集合中的文档。 |
db.* name*.remove() |
remove() 方法从指定集合中删除一个或多个文档。 |
相关信息
- 查看 Working with Collections 以获取一般概述。
- CRUD EBNF Definitions 提供了完整的操作列表。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-collections-operations.html
22.3.3.1 创建、列出和删除集合
在 MySQL Shell 中,您可以创建新集合,获取模式中现有集合的列表,并从模式中删除一个已存在的集合。集合名称区分大小写,每个集合名称必须是唯一的。
确认模式
要显示分配给模式变量的值,请执行:
mysql-js> db
如果模式值不是Schema:world_x
,则通过执行以下命令设置db
变量:
mysql-js> \use world_x
创建一个集合
要在现有模式中创建一个新集合,使用db
对象的createCollection()
方法。以下示例在world_x
模式中创建一个名为flags
的集合。
mysql-js> db.createCollection("flags")
该方法返回一个集合对象。
<Collection:flags>
列出集合
要显示world_x
模式中的所有集合,请使用db
对象的getCollections()
方法。由当前连接到的服务器返回的集合将显示在括号之间。
mysql-js> db.getCollections() [ <Collection:countryinfo>, <Collection:flags> ]
删除一个集合
要从模式中删除一个已存在的集合,使用db
对象的dropCollection()
方法。例如,要从当前模式中删除flags
集合,执行:
mysql-js> db.dropCollection("flags")
dropCollection()
方法也可用于在 MySQL Shell 中从模式中删除关系表。
相关信息
- 查看集合对象以获取更多示例。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-collections-add.html
22.3.3.2 与集合一起工作
要在模式中使用集合,请使用db
全局对象访问当前模式。在此示例中,我们使用之前导入的world_x
模式和countryinfo
集合。因此,您发出的操作格式为db.*
collection_name*.operation
,其中*collection_name
*是执行操作的集合的名称。在以下示例中,操作是针对countryinfo
集合执行的。
添加文档
使用add()
方法将一个文档或文档列表插入到现有集合中。将以下文档插入到countryinfo
集合中。由于这是多行内容,请按两次Enter键以插入文档。
mysql-js> 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-js> 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。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-find.html
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 第十四章,函数和运算符相同。您必须将所有表达式括在引号中。为简洁起见,一些示例未显示输出。
一个简单的搜索条件可能包括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 }, } ]
以下示例搜索所有人均 GNP 高于 5000 亿美元的国家。countryinfo
集合以百万为单位衡量 GNP。
mysql-js> db.countryinfo.find("GNP > 500000") ...[*output removed*] 10 documents in set (0.00 sec)
下面查询中的人口字段嵌入在 demographics 对象中。要访问嵌入字段,请在 demographics 和 Population 之间使用句点来标识关系。文档和字段名称区分大小写。
mysql-js> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000") ...[*output removed*] 6 documents in set (0.00 sec)
下面表达式中的算术运算符用于查询人均 GNP 高于$30000 的国家。搜索条件可以包括算术运算符和大多数 MySQL 函数。
注意
countryinfo
集合中有七个文档的人口值为零。因此,在输出末尾会出现警告消息。
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()
方法将值与搜索条件分离。例如,不要将硬编码的国家名称指定为条件,而是用以字母开头的名称后跟冒号组成的命名占位符替换。然后使用bind(*
占位符*, *
值*)
方法如下:
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)
MySQL8 中文参考(八十三)(3)https://developer.aliyun.com/article/1565957