JS模式:MySQL Shell for 文档型存储
如果使用过 MongoDB,则很容易理解文档型存储是什么意思。这是一种以 json 或 json 的变种格式存储数据的另一种存储方式,通常也被称为 NoSQL。
文档型存储与关系型数据库最明显的一点不同就是:不需要先定义表结构。有些地方说它“无模式”,字面上没啥毛病,但实际业务使用时,并非完全的“无模式”,还是要有一定的规范,只是“表结构”很灵活。
1. 建立连接
MySQL 中使用 X DevAPI 访问文档型存储。所以要使用文档型存储功能,必须连接 X Protocol 端口(默认33060端口):
mysqlsh root@172.16.22.1:33060/db1
2. CURD 操作
具体语法查看文档:https://dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-collections-operations.html
快速开始:
1. 确认 schema
db 是个全局变量,直接执行如果有输出则已经确认了 schema(相当于 use database):
JS > db
列出所有 schema(show database):
JS > session.getSchemas()
[
<Schema:hucq>,
<Schema:information_schema>,
<Schema:mysql>,
<Schema:mysql_innodb_cluster_metadata>,
<Schema:mysqlslap>,
<Schema:performance_schema>,
<Schema:sys>,
<Schema:world_x>
]
没有确认则使用 \use 命令确认数据库:
JS > \use world_x
Default schema `world_x` accessible through db.
JS > db
<Schema:world_x>
2. 列出库下所有集合(相当于关系型数据库的表)
JS > db.getCollections()
[
<Collection:countryinfo>
]
3. 创建、删除集合
JS > db.createCollection("flags")
JS > db.getCollections()
[
<Collection:countryinfo>,
<Collection:flags>
]
JS > db.dropCollection("flags")
创建集合后,也可用切换到 sql 模式,用 show tables 命令看到:
SQL > show tables;
+-------------------+
| Tables_in_world_x |
+-------------------+
| city |
| country |
| countryinfo |
| countrylanguage |
| flags |
+-------------------+
5 rows in set (0.0072 sec)
SQL > show create table flags\G
*************************** 1. row ***************************
Table: flags
Create Table: CREATE TABLE `flags` (
`doc` json DEFAULT NULL,
`_id` varbinary(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
`_json_schema` json GENERATED ALWAYS AS (_utf8mb4'{"type":"object"}') VIRTUAL,
PRIMARY KEY (`_id`),
CONSTRAINT `$val_strict_77008DA65064FAF543C6109399AB20432EE703D7` CHECK (json_schema_valid(`_json_schema`,`doc`)) /*!80016 NOT ENFORCED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.0014 sec)
集合用的也是 InnoDB 引擎,集合与表的区别应该就是 “doc
json DEFAULT NULL” 这一个字段的定义。
疑问:是如何实现的?暂时没做研究
4. 插入文档(相当于关系型数据库中的数据行)
JS > db.flags.add(
{
name:"hucq",
age:18,
city: {
work:"shanghai",
born:"changsha"
}
}
)
Query OK, 1 item affected (0.0088 sec)
5. 查找文档
JS > db.flags.find("age >= 18 and city.born = 'beijing'")
{
"_id": "00005e9818080000000000000005",
"age": 28,
"city": {
"born": "beijing",
"work": "shanghai"
},
"name": "jack"
}
1 document in set (0.0023 sec)
JS模式:MySQL Shell for 关系型数据表
X DevAPI 不止能操作文档型数据表,也能操作关系型数据表。具体语法见:https://dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-relational-tables.html
快速开始:
1. 也是先确认 schema
2. 列出所有表
JS > db.getTables()
[
<Table:city>,
<Table:country>,
<Table:countrylanguage>
]
3. 插入数据
JS > db.city.insert("ID", "Name", "CountryCode", "District", "Info").values(
5000, "Olympia", "USA", "Washington", '{"Population": 5000}')
4. 查找数据
JS > db.city.select(["Name", "CountryCode"]).where("Name like 'Zar%' and CountryCode = 'NGA'")
+-------+-------------+
| Name | CountryCode |
+-------+-------------+
| Zaria | NGA |
+-------+-------------+
1 row in set (0.0023 sec)
5. 更新数据
JS > db.city.update().set("Name","Hucq").where("Name like 'Zar%' and CountryCode = 'NGA'")
Query OK, 1 item affected (0.0136 sec)
Rows matched: 1 Changed: 1 Warnings: 0
6. 删除数据
JS > db.city.delete().where("Name = 'Zaragoza'")
Query OK, 1 item affected (0.0151 sec)
7. 创建、删除表
没找到命令,尤其是手册里的 session.dropCollection(),并没有找到有这个命令
网友评论