JSON-пути¶
В этом руководстве показано, как обновлять данные в спейсе через JSON-пути.
Содержание:
Пререквизиты¶
Для выполнения примера требуются:
установленный Docker-образ Tarantool DB;
приложение Docker Compose;
исходные файлы примера
json_path
.Примечание
Есть два способа получить исходные файлы примера:
Архив с полной документацией Tarantool DB, полученный по почте или скачанный в личном кабинете tarantool.io. Пример архива:
tarantooldb-documentation-2.0.0.tar.gz
. Примерjson_path
расположен в таком архиве в директории./doc/examples/json_path/
.Отдельный архив json_path.tar.gz, скачанный c сайта Tarantool.
Запуск стенда¶
Перейдите в директорию примера json_path
:
cd ./doc/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.test
t = { 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