我希望能够通过简单的SQL语句创建MySQL文档存储集合,而不是使用X协议客户端。
有没有办法这样做?
编辑:我会尽量澄清这个问题。
集合是使用JSON数据类型和函数的表。这点很清楚。我想知道如何在不使用X-Protocol调用的情况下创建一个集合,并确保将上述集合作为实际的集合来获取。
从MySQL工作台来看,集合表有一个带有表达式的_id blob、一个doc列和其他一些我现在不记得的元素(可能是索引,等等)。
我无法通过Workbench告诉表是否需要任何额外的模式/元数据信息才能被视为Document集合,或者仅仅存在一个_id和doc列就足够了。
我希望这能把事情弄清楚。
发布于 2020-07-08 13:25:31
所有"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以来,除了在doc上使用JSON_EXTRACT并应该在索引中使用的生成列之外,不允许添加其他列,请参阅下面的内容(尽管它们实际上不必在索引中使用)。
任何类似于此的表-- doc和_id及其正确的类型/表达式,除了可选的_json_schema和生成的JSON_EXTRACT(doc,-columns之外,没有其他列--都将在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语法(通过x-api使用它们时将实际执行这些语法)。
https://stackoverflow.com/questions/62790796
复制相似问题