JSON-пути
В этом руководстве показано, как обновлять данные в спейсе через JSON-пути.
Содержание:
Для выполнения примера требуются:
-
установленный Docker-образ Tarantool DB;
-
приложение Docker Compose;
-
исходные файлы примера
json_path.
Перейдите в директорию примера json_path:
cd ./docs/docs/ru/assets/examples/json_path/
Запустите стенд:
make start
Запущенный стенд состоит из:
- кластера Tarantool DB:
- 1 роутер-хранилище;
- 1 Tarantool Cluster Manager (TCM);
- кластера etcd из 3 узлов.
После запуска должны работать все контейнеры, кроме init_host.
Также после запуска кластера становится доступен веб-интерфейс TCM. Для входа в TCM откройте в браузере адрес http://localhost:8081. Логин и пароль для входа:
- Username:
admin - Password:
secret
В TCM откройте вкладку Stateboard.
Выберите в наборе реплик router-storage-1 узел router-storage-1 и в открывшемся окне перейдите на вкладку Terminal.
Во вкладке Terminal проверьте наличие спейса test:
box.space
Спейс test должен присутствовать в выводе, он создается при запуске кластера.
В руководстве используются следующие файлы примера json_path:
cluster/— директория c файлами для запуска кластера Tarantool DB:config.yml— конфигурация и топология кластера;docker-compose.yml— описание узлов кластера Tarantool DB;migrations/scenario— директория, содержащая файлы с описанием миграций;
tools/— директория с файлами для запуска кластера etcd и TCM:docker-compose.yml— описание узлов кластера etcd;tcm.yml— конфигурация для запуска Tarantool Cluster Manager.
В примере создан спейс test со следующим форматом:
local space_test = box.schema.space.create('test', {if_not_exists = true})space_test:format({{ name = 'id', type = 'integer' },{ name = 'bucket_id', type = 'unsigned' },{ name = 'users', type = 'map' },{ name = 'authors', type = 'array' },{ name = 'payload', type = 'string', is_nullable = true },})space_test:create_index('pk', { parts = {'id'}, if_not_exists = true})space_test:create_index('bucket_id', { parts = {'bucket_id'}, unique = false, if_not_exists = true})helpers.register_sharding_key('test', {'id'})
Чтобы подключиться к роутеру, в веб-интерфейсе TCM перейдите на вкладку Stateboard.
В наборе реплик router-storage-1 выберите роутер router-storage-1 и в открывшемся окне перейдите на вкладку Terminal.
Создайте кортеж и добавьте его в спейс test:
s = box.space.testt = { 1, 1, { key1 = 'value', key2 = 10 }, { 2, 3 , { key3 = 20 }}}t = s:replace(t)
Проверьте, что в спейсе появились данные.
Для этого в TCM перейдите на вкладку Tuples и выберите в списке спейс test.
В открывшейся вкладке видно, что в спейс добавлен новый кортеж.
Чтобы заменить значение одного ключа на другое, обновите в кортеже значение поля users.key1:
s:update({1}, {{'=', 'users.key1', 'new_value'}})
Вывод будет выглядеть так:
---- [1, 1, {'key1': 'new_value', 'key2': 10}, [2, 3, {'key3': 20}]]...
Теперь увеличьте на 1 значение второго элемента из массива authors.
Массив authors имеет формат { name = 'authors', type = 'array' }. Сейчас в массив записано значение [2, 3, {'key3': 20}].
s:update({1}, {{'+', 'authors[2]', 1}})
Вывод будет выглядеть так:
---- [1, 1, {'key1': 'new_value', 'key2': 10}, [2, 4, {'key3': 20}]]...
Теперь добавьте данные в кортеж внутри спейса по ключу:
s:update({1}, {{'!', 'payload', 'inserted_value'}})
В схеме уже есть поле payload со следующим форматом: { name = 'payload', type = 'string', is_nullable = true }.
Вывод выглядит так:
---- [1, 1, {'key1': 'new_value', 'key2': 10}, [2, 4, {'key3': 20}], 'inserted_value']...
Теперь удалите из кортежа значение поля users.key2 и добавьте в поле authors новый ключ key4:
s:update({1}, {{'#', '[3].key2', 1}, {'=', '[4][3].key4', 'value4'}})
Вывод выглядит так:
---- [1, 1, {'key1': 'new_value'}, [2, 4, {'key3': 20, 'key4': 'value4'}], 'inserted_value']...
После обновите значение кортежа и просмотрите результат:
s:upsert({1, 1, {k = 'v'}, {}}, {{'#', '[3].key1', 1}})s:select{}
Вывод выглядит так:
---- - [1, 1, {}, [2, 4, {'key3': 20, 'key4': 'value4'}], 'inserted_value']...
Чтобы остановить кластер, выполните в локальном терминале следующую команду:
make stop