MySQL 8: создание коллекций через DDL

Я хотел бы иметь возможность создавать коллекции хранилища документов MySQL с помощью простых операторов SQL DDL, а не с использованием клиентов X-Protocol.

Есть ли способ сделать это?

Изменить: я постараюсь прояснить вопрос.

Коллекции - это таблицы, использующие типы данных и функции JSON. Это ясно. Я хотел бы знать, как я могу создать коллекцию без использования вызовов X-Protocol и убедиться, что вышеупомянутая коллекция выбрана как фактическая коллекция.

Судя по рабочей среде MySQL, в таблицах коллекций есть PK _id blob с выражением, столбец doc JSON и несколько других элементов, которые я не помню на данный момент (могут быть индексы и т. Д.).

У меня нет средств сообщить через Workbench, какая дополнительная информация о схеме / метаданных требуется для того, чтобы таблица считалась коллекцией хранилища документов, или достаточно ли простого наличия столбцов _id и doc.

Надеюсь, это проясняет ситуацию.

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,-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 DML (который фактически будет выполняться, когда вы используете их через x-api).

Другие вопросы по тегам