0

我希望能够通过简单的 SQL DDL 语句而不是使用 X-Protocol 客户端来创建 MySQL 文档存储集合。

有什么办法吗?

编辑:我会尝试澄清这个问题。

集合是使用 JSON 数据类型和函数的表。这很清楚。我想知道如何在不使用 X-Protocol 调用的情况下创建一个集合,并确保将上述集合作为一个实际的集合。

从 MySQL 工作台来看,集合表有一个带有表达式的 _id blob PK、一个 doc JSON 列和一些我目前不记得的其他元素(可能是索引等)。

我无法通过 Workbench 告诉我们需要什么额外的模式/元数据信息才能将表视为文档存储集合,或者仅仅存在 _id 和 doc 列是否就足够了。

我希望这能解决问题。

4

1 回答 1

2

所有“x-api”指令都直接映射到 sql 语法。例如,当您运行时db.createCollection('my_collection'),MySQL 将直接执行

CREATE TABLE `my_collection` (
  `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` CHECK (json_schema_valid(`_json_schema`,`doc`))
      NOT ENFORCED
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

如果您遵循该格式,您可以自己运行相应的 sql 语句。doc和(以及它们的_id类型和给定的表达式)是必需的,_json_schema是可选的,检查也是(并且仅从 M​​ySQL 8.0.17 开始添加)。从 MySQL 8 开始,不允许使用其他列,除了生成的列使用JSON_EXTRACTondoc并且应该在索引中使用,见下文(尽管它们实际上不必在索引中使用)。

任何看起来像这样的表 -doc并且_id具有正确的类型/表达式,并且除了可选_json_schema和生成的 - 列之外没有其他列JSON_EXTRACT(doc,- 将使用getCollections().

要添加索引,对应的语法为

my_collection.createIndex("age", {fields: [{field: "$.age", type: "int"}]})

将会

ALTER TABLE `test`.`my_collection` ADD COLUMN `$ix_i_somename` int
      GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$.age')) VIRTUAL, 
   ADD INDEX `age` (`$ix_i_somename`)

明显地,

db.dropCollection('my_collection')

简单地转化为

DROP TABLE `my_collection`

类似地,对文档的所有 CRUD 操作都有相应的 sql DML 语法(当您通过 x-api 使用它们时会实际执行)。

于 2020-07-08T13:25:31.013 回答