RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 5. Работа с документами

Как только коллекция была создана, она может хранить документы JSON. Вы храните документы, передавая структуру данных JSON функции Collection.add(). У некоторых языков есть прямая поддержка данных JSON, у других есть эквивалентный синтаксис, чтобы представлять те данные. MySQL Connectors, которые осуществляют X DevAPI, обеспечивают поддержку всех методов, которые являются родными на определенном языке.

Кроме того, в некоторых MySQL Connectors могут использоваться объекты DbDoc. Наиболее удобный способ создать их, это вызов Collection.newDoc(). DbDoc это тип данных, чтобы представлять документы JSON, как он осуществляется не определяется. Языки, осуществляющие X DevAPI, свободны следовать за объектно-ориентированным подходом с методами получателя и установщика или использовать стиль структуры C с публичными членами.

Для строго типизированных языков возможно создать файлы класса на основе определения структуры документа коллекций. MySQL Shell может использоваться, чтобы создать эти файлы.

Объекты документа

Поддержанные языки

Преимущества

Native JSON

Скрипты (JavaScript, Python)

Просто в использовании

Эквивалентный синтаксис JSON

C# (Anonymous Types, ExpandoObject)

Просто в использовании

DbDoc

Все языки вообще

Не зависит от языка

Generated Doc Classes

Строго типизированные языки (C#)

Естественный в использовании

Следующий пример показывает различные методы вставки документов в коллекцию.

MySQL Shell JavaScript Code

// Create a new collection 'my_collection'
var myColl = db.createCollection('my_collection');

// Insert JSON data directly
myColl.add({_id: '8901', name: 'Sakila', age: 15});
// Inserting several docs at once
myColl.add([ {_id: '8902', name: 'Susanne', age: 24},
             {_id: '8903', name: 'User', age: 39} ]);

MySQL Shell Python Code

// Create a new collection 'my_collection'
var myColl = db.createCollection('my_collection');

// Insert JSON data directly
myColl.add({_id: '8901', name: 'Sakila', age: 15});
// Inserting several docs at once
myColl.add([ {_id: '8902', name: 'Susanne', age: 24},
             {_id: '8903', name: 'User', age: 39} ]);

Node.js JavaScript Code

// Create a new collection 'my_collection'
db.createCollection('my_collection').then(function (myColl) {
  // Add a document to insert
  var insert = myColl.add({ name: 'Sakila', age: 15 });
  // Add multiple documents to insert
  insert.add([
    { name: 'Susanne', age: 24 },
    { name: 'User', age: 39 }
  ]);
  // Add one more document to insert
  var myDoc = {};
  myDoc.name = 'James';
  myDoc.age = 47;
  insert.add(myDoc);
  // run the operation
  return insert.execute();
});

C# Code

// Create a new collection "my_collection"
var myColl = db.CreateCollection("my_collection");
// Insert JSON data directly
myColl.Add(new { name = "Sakila", age = 15 }).Execute();

// Inserting several docs at once
myColl.Add(new[] {new { name = "Susanne", age = 24},
                  new { name = "User", age = 39} }).Execute();
// Insert Documents
var myDoc = new DbDoc();
myDoc.SetValue("name", "James");
myDoc.SetValue("age", 47);
myColl.Add(myDoc).Execute();

//Fetch all docs
var docResult = myColl.Find().Execute();
var docs = docResult.FetchAll();

Python Code

# Create a new collection 'my_collection'
my_coll = my_schema.create_collection('my_collection')

# Insert JSON data directly
my_coll.add({'name': 'Sakila', 'age': 15})
# Inserting several docs at once
my_coll.add([
  {'name': 'Susanne', 'age': 24},
  {'name': 'User', 'age': 39}
])

Java Code

// Create a new collection 'my_collection'
Collection coll = db.createCollection("my_collection");

// Insert JSON data directly
coll.add("{\"name\":\"Sakila\", \"age\":15}");
// Insert several documents at once
coll.add("{\"name\":\"Susanne\", \"age\":24}",
         "{\"name\":\"User\", \"age\":39}");

// Insert Documents
DbDoc myDoc = new coll.newDoc();
myDoc.add("name", new JsonString().setValue("James"));
myDoc.add("age", new JsonNumber().setValue("47"));
coll.add(myDoc);

C++ Code

// Create a new collection 'my_collection'
Collection myColl = db.createCollection("my_collection");

// Insert JSON data directly
myColl.add(R"({"name": "Sakila", "age": 15})").execute();
// Inserting several docs at once
std::list<DbDoc> docs = {
  DbDoc(R"({"name": "Susanne", "age": 24})"),
  DbDoc(R"({"name": "User", "age": 39})")
};
myColl.add(docs).execute();

5.1. Работа с Document ID

У каждого документа есть уникальный идентификатор, названный document ID, который может считаться эквивалентом первичного ключа таблицы. Значение идентификатора обычно автоматически производится сервером, когда документ добавляется, но может также быть вручную назначено. Назначенный document ID возвращен в результате операции collection.add(). См. раздел 5.1.1.

Следующее показано в качестве примеров, добавляющих документ в коллекцию, восстанавливая ID добавленного документа и проверяя, что дубликаты ID не могут быть добавлены.

mysql-js > mycollection.add({test:'demo01'})
Query OK, 1 item affected (0.00 sec)

mysql-js > mycollection.add({test:'demo02'}).add({test:'demo03'})
Query OK, 2 items affected (0.00 sec)

mysql-js > mycollection.find()
[
  {
    "_id": "00005a640138000000000000002c",
    "test": "demo01"
  },
  {
    "_id": "00005a640138000000000000002d",
    "test": "demo02"
  },
  {
    "_id": "00005a640138000000000000002e",
    "test": "demo03"
  }
]
3 documents in set (0.00 sec)

mysql-js > mycollection.add({_id:'00005a640138000000000000002f', test:'demo04'})
Query OK, 1 item affected (0.00 sec)

mysql-js > mycollection.find()
[
  {
    "_id": "00005a640138000000000000002c",
    "test": "demo01"
  },
  {
    "_id": "00005a640138000000000000002d",
    "test": "demo02"
  },
  {
    "_id": "00005a640138000000000000002e",
    "test": "demo03"
  },
  {
    "_id": "00005a640138000000000000002f",
    "test": "demo04"
  }
]
4 documents in set (0.00 sec)

mysql-js > mycollection.add({test:'demo05'})
ERROR: 5116: Document contains a field value that is not unique
but required to be

5.1.1. Понимание Document ID

X DevAPI полагается на базирующийся на сервере генератор document ID, добавленный в версии MySQL version 8.0.11, который приводит к последовательно увеличивающемуся document ID для всех клиентов. InnoDB использует document ID в качестве первичного ключа, поэтому эти последовательные первичные ключи для всех клиентов применяются в эффективных расщеплениях страницы и перестройках дерева.

Свойства Document ID

Поле _id документа ведет себя таким же образом как любая другая область документа во время запросов за исключением того, что его значение не может измениться после вставки в коллекцию. Поле _id используется в качестве первичного ключа коллекции (использующей сохраненные произведенные столбцы). Возможно отвергнуть автоматическую генерацию document ID вручную включая ID.

При использовании ручной вставки document ID, необходимо гарантировать, что ID из автоматически произведенной сервером последовательности ID никогда не используются. X Plugin не знает о данных, вставленных в коллекцию, включая ID, которые вы используете. Таким образом в будущих вставках, если document ID, который вы назначили вручную, вставляя документ, использует ID, который сервер собирался использовать, операция вставки терпит неудачу с ошибкой из-за дублирования первичного ключа.

Каждый раз, когда значение поля _id не присутствует во вставленном документе, сервер производит значение _id. Произведенное значение _id, используемое для документа, возвращено клиенту как часть сообщения Result о вставке документа. При использовании X DevAPI на кластере InnoDB автоматически произведенное _id должно быть уникальным в пределах кластера. Используйте опцию mysqlx_document_id_unique_prefix , чтобы гарантировать, что часть unique_prefix document ID уникальна для replicaset или группы.

Поле _id должно быть последовательным (всегда увеличивающимся) для оптимальной работы вставки InnoDB (по крайней мере, в единственном сервере). Последовательная природа _id сохраняется через перезапуски сервера.

В Group Replication с несколькими мастерами или на кластере InnoDB произведенные значения _id таблицы уникальны между экземплярами, чтобы избежать конфликтов первичного ключа и минимизировать операционную сертификацию.

Создание Document ID

Этот раздел описывает, как document ID форматируется. Общая структура таблицы коллекции остается неизменной, за исключением типа произведенного столбца _id, который изменяется от VARCHAR(32) на VARBINARY(32).

Формат автоматически произведенного document ID:

unique_prefix start_timestamp serial
4 байта8 байт 16 байт

Здесь:

  • serial автоматически увеличенное значение порядкового номера экземпляра (целое число), которое является закодированным в 16-чном виде и имеет диапазон от 0 до 2**64-1. Начальное значение of serial установлено в системной переменной auto_increment_offset и приращение задано системной переменной auto_increment_increment.

  • start_timestamp метка времени запуска экзепляра в шестнадцатеричном формате. В маловероятном случае, что значение serial переполнится, start_timestamp увеличено на 1 и serial перезапускается с 0.

  • unique_prefix значение, назначенное кластером InnoDB экземпляру, которое используется, чтобы сделать document ID уникальным через все узлы этого кластера. Диапазон unique_prefix от 0 до 2**16-1 в шестнадцатеричном формате и по умолчанию 0, если не установлен кластером InnoDB или системная переменная mysqlx_document_id_unique_prefix не была задана.

Этот формат document ID гарантирует, что:

  • Значение первичного ключа монотонно увеличивается для вставок, происходящих из единственного экземпляра сервера, хотя интервал между значениями не однороден в таблице.

  • Используя Group Replication или кластер InnoDB, у вставок в ту же самую таблицу от различных экземпляров нет противоречивых значений первичного ключа, предполагается, что экземпляры имеют правильно настроенные системные переменные auto_increment_* .

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru