所有“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
ondoc
并且应该在索引中使用,见下文(尽管它们实际上不必在索引中使用)。
任何看起来像这样的表 -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 使用它们时会实际执行)。