DocumentDB Когда PostgreSQL встречается с MongoDB
Знакомая ситуация? Команда до хрипоты спорит, что выбрать для нового проекта: старый-добрый PostgreSQL с его надежностью, транзакциями и строгой схемой, или гибкий и масштабируемый MongoDB, который так любят за работу с JSON-подобными документами. Один лагерь ратует за ACID и мощь SQL, другой — за скорость разработки и свободу от миграций. А что, если я скажу вам, что выбирать больше не нужно?
Сегодня мы заглянем под капот проекта DocumentDB — амбициозной попытки скрестить ежа с ужом, а точнее, научить PostgreSQL работать с документами так же нативно, как это делает MongoDB. И, спойлер, у них получилось нечто очень интересное.
Что такое DocumentDB и зачем он нужен?
Если коротко, DocumentDB — это документо-ориентированная база данных с открытым исходным кодом, которая работает поверх PostgreSQL и полностью совместима с MongoDB API.
Представьте, что вы взяли свой любимый, проверенный временем PostgreSQL и установили на него расширение, которое добавляет поддержку BSON (бинарного JSON) и API для работы с ним. Теперь вы можете общаться со старым другом Postgres, используя привычные драйверы и инструменты из экосистемы MongoDB.
Зачем это нужно разработчику?
- Лучшее из двух миров: Вы получаете гибкость NoSQL для работы с документами со свободной схемой и одновременно всю мощь PostgreSQL: ACID-транзакции, сложнейшие запросы, развитые механизмы индексации и надежность, проверенную десятилетиями.
- Единая база данных: Вместо того чтобы поддерживать зоопарк из реляционной и документарной баз, вы можете хранить и те, и другие данные в одном месте. Это упрощает архитектуру, бэкапы и администрирование.
- Плавный переход: Если у вас уже есть приложение, работающее с MongoDB, вы можете переключить его на DocumentDB, просто изменив строку подключения. Никакой миграции кода!
- Полный контроль: Это полностью открытый проект под лицензией MIT. Вы можете развернуть его на своих серверах (on-premise), полностью контролируя данные, безопасность и производительность, без привязки к облачным провайдерам.
Как это работает под капотом?
Магия DocumentDB состоит из трех ключевых компонентов, которые работают в связке:
pg_documentdb_core: Это сердце системы. PostgreSQL-расширение, которое добавляет в базу нативный тип данных BSON и операторы для работы с ним. По сути, это "словарь", который учит Postgres понимать новый для него язык документов.pg_documentdb: Публичный API, который предоставляет функции для CRUD-операций (создание, чтение, обновление, удаление) над документами.pg_documentdb_gw: Самая интересная часть — шлюз-переводчик. Этот компонент принимает запросы, написанные на MongoDB API, и на лету транслирует их в понятные для PostgreSQL SQL-запросы. Именно благодаря ему вы можете использоватьpymongoили другой MongoDB-драйвер для работы с Postgres.
Давайте попробуем за 5 минут
Хватит теории, давайте запустим DocumentDB и посмотрим, как это выглядит на практике. Разработчики позаботились о Docker-образе, так что процесс до смешного прост.
Шаг 1: Устанавливаем зависимости
Нам понадобится Python-драйвер для MongoDB.
pip install pymongo dnspython
Шаг 2: Запускаем контейнер с DocumentDB
Эта команда скачает свежий образ и запустит контейнер. Не забудьте заменить <YOUR_USERNAME> и <YOUR_PASSWORD> на свои.
docker pull ghcr.io/documentdb/documentdb/documentdb-local:latest
docker tag ghcr.io/documentdb/documentdb/documentdb-local:latest documentdb
docker run -dt -p 10260:10260 --name documentdb-container documentdb --username <YOUR_USERNAME> --password <YOUR_PASSWORD>
Интересный момент: по умолчанию используется порт 10260, чтобы не конфликтовать с локально запущенным MongoDB, у которого стандартный порт 27017.
Шаг 3: Подключаемся и работаем с данными
Теперь напишем небольшой Python-скрипт. Обратите внимание, мы используем pymongo, как будто работаем с обычной MongoDB.
import pymongo
from pymongo import MongoClient
# Подключаемся к нашему DocumentDB в Docker
client = pymongo.MongoClient(
'mongodb://<YOUR_USERNAME>:<YOUR_PASSWORD>@localhost:10260/?tls=true&tlsAllowInvalidCertificates=true'
)
# Создаем базу и коллекцию
db = client["myTestDatabase"]
collection = db.create_collection("users")
# Вставляем несколько документов
collection.insert_many([
{
'name': 'Иван Петров',
'email': 'ivan@email.com',
'skills': ['Python', 'PostgreSQL', 'Docker']
},
{
'name': 'Мария Сидорова',
'email': 'maria@email.com',
'skills': ['JavaScript', 'React', 'Node.js']
}
])
# Находим и выводим все документы
print("Все пользователи:")
for user in collection.find():
print(user)
# Используем агрегацию для поиска Python-разработчиков
pipeline = [
{'$match': {'skills': 'Python'}},
{'$project': {
'_id': 0,
'name': 1,
'email': 1
}}
]
print("\nТолько Python-разработчики:")
results = collection.aggregate(pipeline)
for doc in results:
print(doc)
Как видите, с точки зрения кода приложения, мы работаем с обычной документо-ориентированной базой. Но под капотом все эти операции выполняет надежный и мощный PostgreSQL.
Кому особенно пригодится DocumentDB?
Я вижу несколько сценариев, где этот проект может стать настоящей находкой:
- Стартапы и проекты на старте: Когда схема данных еще не устоялась и постоянно меняется, гибкость документов — это огромное преимущество. DocumentDB позволяет начать быстро, как с NoSQL, но оставляет под капотом мощный реляционный движок на будущее.
- Компании с экспертизой в PostgreSQL: Если ваша команда отлично знает и любит Postgres, но новому проекту нужна работа с документами, DocumentDB — идеальный выбор. Не нужно изучать новую систему, нанимать отдельных администраторов и строить сложную инфраструктуру.
- Аналитические системы: Возможность комбинировать структурированные данные из SQL-таблиц и полуструктурированные из коллекций документов в одной базе открывает потрясающие возможности для аналитики.
- Проекты, мигрирующие с MongoDB: Для тех, кто ищет открытую и self-hosted альтернативу MongoDB Atlas, DocumentDB может стать отличным решением, предлагая знакомый API на проверенной временем основе.
DocumentDB — это не просто очередной клон MongoDB. Это умный и прагматичный подход, который объединяет сильные стороны двух разных миров. Проект дает разработчикам гибкость NoSQL, не заставляя отказываться от надежности, мощи и богатой экосистемы PostgreSQL.
Конечно, проект еще развивается, но уже сейчас выглядит очень многообещающе. Если вы стоите перед выбором между SQL и NoSQL или просто ищете способ подружить эти два подхода в рамках одного стека — обязательно загляните на GitHub репозиторий DocumentDB, поставьте звездочку и попробуйте запустить его в Docker. Возможно, это именно то решение, которое вы так долго искали.
