Введение
Для начала давайте поймем, что же такое NoSQL и зачем это нужно. Если упрощенно, то это концепция, отличная от традиционных известных нам реляционных баз.
- Эти СУБД, как правило, не поддерживают ANSI SQL. Конечно есть ODBC драйверы, которые пытаются переложить SQL запрос на язык СУБД, но это не совсем то.
- Структура базы не регламентирована. Внутри каждой базы может быть произвольное число коллекций (таблиц) с произвольным числом документов (записей) произвольной структуры. То есть таблицы в NoSQL базах имеют произвольную структуру.
- Нет транзакций в привычном нам понимании этого слова. Можно гарантированно изменить один документ, но для согласованного изменения нескольких документов в разных коллекциях придется прибегнуть к ухищрениям.
- Более разнообразные методы распределения данных. Возможность одновременного использования шардинга и репликации. Вы можете как распределять копию всех данных, так и частично распределять данные по серверам, увеличивая производительность чтения данных.
Более подробно можно прочитать тут — https://habrahabr.ru/post/152477/.
Обычное применение таких СУБД – высоконагруженные системы обрабатывающие большой объем информации с произвольной структурой. Можно ли применять такие СУБД в обычной жизни? Конечно можно и нужно, но каждый раз мы должны отдавать себе отчет, что для каждой конкретной задачи нужно применять наиболее подходящий для этого инструмент. Например, для хранения данных структуры базы 1С NoSQL не подходит, т.к. нам нужны транзакции и у нас фиксированная структура. А вот для хранения журнала регистрации (пример хранения журнала регистрации в MongoDB — //infostart.ru/public/558101), файлов (пример хранения файлов в MongoDB — //infostart.ru/public/624829/), какой-то произвольной не регламентированной по структуре информации мы вполне можем использовать базу вроде MongoDB, т.к. транзакции нам не нужны, но нужна высокая скорость и хранение больших объемов.
RESTHeart
REST – это регламент взаимодействия с сетевым приложением, когда все инструкции для приложения мы передаем через HTTP запросы. RESTHeart представляет собой веб сервер, написанный на Java, который принимает REST команды и трансформирует их в команды MongoDB. В традиционном HTTP есть два запроса: GET для получения данных и POST для их модификации. Но для REST их число пришлось расширить: PUT, DELETE, PATCH.
Структура данных в запросе выглядит следующим образом:
/DataBase/Collection/DocID?Parameters, где
- DataBase – имя базы данных,
- Collection – имя коллекции,
- DocID – идентификатор документа
- Parameters – дополнительные параметры
Примеры запросов
Тип запроса | Текст запроса | Описание |
GET | /DB/Col | Получение всех документов из коллекции Colбазы DB |
GET | /DB/Col/id | Получение документа с идентификатором id из коллекции Col из базы DB |
GET | /DB/Col?filter="{‘name’:’Alex’}" | Получение всех документов из коллекции Colиз базы DB у которых свойство name = Alex |
PUT | /DB/Col | Создание коллекции Col в базе DB |
POST | /DB/Col {"address": "Red square", "city": "Moscow"} | Создание в коллекции Col базы DB документа со свойствами address = Red square и city = Moscow |
DELETE | /DB/Col/id | Удаление документа с идентификатором id из коллекции Col из базы DB |
Логика довольно проста и понятна. Теперь разберемся с тем, как нам установить этот сервер.
- Скачаем и установим СУБД MongoDB с сайта https://www.mongodb.com/. Базовая версия – бесплатна.
- Скачаем оболочку для работы с MongoDB – RoboMongo с сайта https://robomongo.org/. Она так же бесплатна.
- Создадим на диске С каталог Data\Db, это каталог для баз по умолчанию, чтобы не разбираться с параметрами запуска MongoDB.
- Запустим сервер СУБД командой mongod.exe Это запустит сервер без авторизации под полными правами.
- Запустим RoboMongo и подключимся к локальному серверу. Наш сервер будет запущен на localhost или 127.0.0.1 на стандартном порту 27017.
- Создадим на сервере базу FileBase и коллекцию в ней – FileTable.
- Создадим пользователя, для работы с базой. Для этого запустим shell в RoboMongo. Важно создать пользователя именно через shell, иначе его нельзя будет использовать при авторизации (видимо глюк приложения).
use admin
db.createUser({user: “admin”,pwd: “pwd”,roles:[“root”]})
- Теперь прервем приложение mongod.exe и запустим его заново командой «mongod.exe —auth», теперь наша база работает с использованием авторизации и без учетных данных мы к ней не подключимся.
- Скачиваем и устанавливаем Java SE с сайта Oracle.
- Скачиваем сервер RESTHeart с официального сайта http://restheart.org/. Данный продукт – бесплатен.
- Настраиваем RESTHeart сервер, для этого отредактируем файл security.yml. В секции users зададим пользователя, под которым будем заходить в базу. Для простоты будем использовать административную учетную запись.
users:
— userid: admin
password: pwd
roles: [admins]
- Продолжим настройку и отредактируем файл restheart.yml. Отредактируем секцию с указанием протокола и порта для подключения, оставим только стандартный протокол http
https-listener: false
https-host: 0.0.0.0
https-port: 4443
http-listener: true
http-host: 0.0.0.0
http-port: 8080
ajp-listener: false
ajp-host: 0.0.0.0
ajp-port: 8009
- Отредактируем mongo-uri строку в restheart.yml
mongo-uri: mongodb://admin:pwd@127.0.0.1/?authSource=admin
- Наш сервер готов к работе, запустим его командой «java -server -jar restheart.jar etc/restheart.yml»
Теперь наша связка RESTHeart и MongoDB готова и ждет наших команд.
Вот пример кода 1С для нашего сервера RESTHeart который создает документ с идентификатором Объект.ID. Функция ХэшАвторизации – это строка вида «admin:pwd» закодированная в Base64.
HTTPСоединение = Новый HTTPСоединение("127.0.0.1", 8080, "admin", "pwd",, 10);
ЧтениеJSON = Новый ЧтениеJSON;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаголовокЗапроса = Новый Соответствие;
ЗаголовокЗапроса.Вставить("Content-Type", "application/json");
ЗаголовокЗапроса.Вставить("Authorization", "Basic " + ХэшАвторизации("admin", "pwd"));
HTTPЗапрос = Новый HTTPЗапрос("/FileBase/FileTable/" + Объект.ID + "?id_type=STRING", ЗаголовокЗапроса);
Ответ = HTTPСоединение.ВызватьHTTPМетод("PUT", HTTPЗапрос);
Вот собственно и все. Если у вас есть желание сделать данную связь более безопасной или сложной – то на приведенных сайтах можете изучить инструкцию и поработать с настройками, задача этой статьи – дать вам возможность быстрого старта.
Если вас интересует пример реализации хранения файлов и изображений из базы 1С в MongoDB, то можете рассмотреть мою публикацию //infostart.ru/public/624829/, в ней реализован такой функционал. Во вложении к данной публикации я разместил файлы настроек RESTHeart, с которыми у меня на локальной машине все работало.