MySQL8 中文参考(八十三)(2)

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

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模式,然后按照以下步骤操作:

  1. 下载world_x-db.zip
  2. 将安装归档文件提取到临时位置,例如/tmp/。解压缩归档文件会生成一个名为world_x.sql的单个文件。
  3. 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
  1. /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&&)、XORISNOTBETWEENINLIKE!=<>>>=<<=&|<<>>+-*/~%

查找集合中的所有文档

要返回集合中的所有文档,请使用不指定搜索条件的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

相关实践学习
如何快速连接云数据库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