我希望能够通过简单的SQL DDL语句而不是使用X-Protocol客户端来创建MySQL Document Store Collections。
有什么办法吗?
编辑:我将尝试阐明问题。
集合是使用JSON数据类型和函数的表。那很清楚。 我想知道如何在不使用X-Protocol调用 的情况下创建馆藏,并确保将上述馆藏选作实际的馆藏。
从MySQL工作台来看,收集表具有一个_id blob PK,该表达式带有表达式,doc JSON列和我暂时不记得的其他一些元素(可能是索引等)。
我无法通过工作台告知将表视为文档存储集合所需的其他架构/元数据信息,或者仅存在_id和doc列是否足够。
我希望这可以解决所有问题。
答案 0 :(得分:1)
所有“ 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
是可选的,检查也是可选的(仅自MySQL 8.0.17起才添加)。从MySQL 8开始,除了在JSON_EXTRACT
上使用doc
并应在索引中使用的生成列之外,不允许使用其他列,请参见下文(尽管实际上不必使用它们在索引中)。
任何看起来像这样的表-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使用它们时实际上将执行该语法)。