DocumentDB Когда PostgreSQL встречается с MongoDB

16 Jun, 2026
3,370
🔱 240
👥 32

Знакомая ситуация? Команда до хрипоты спорит, что выбрать для нового проекта: старый-добрый PostgreSQL с его надежностью, транзакциями и строгой схемой, или гибкий и масштабируемый MongoDB, который так любят за работу с JSON-подобными документами. Один лагерь ратует за ACID и мощь SQL, другой — за скорость разработки и свободу от миграций. А что, если я скажу вам, что выбирать больше не нужно?

Сегодня мы заглянем под капот проекта DocumentDB — амбициозной попытки скрестить ежа с ужом, а точнее, научить PostgreSQL работать с документами так же нативно, как это делает MongoDB. И, спойлер, у них получилось нечто очень интересное.

Что такое DocumentDB и зачем он нужен?

Если коротко, DocumentDB — это документо-ориентированная база данных с открытым исходным кодом, которая работает поверх PostgreSQL и полностью совместима с MongoDB API.

Представьте, что вы взяли свой любимый, проверенный временем PostgreSQL и установили на него расширение, которое добавляет поддержку BSON (бинарного JSON) и API для работы с ним. Теперь вы можете общаться со старым другом Postgres, используя привычные драйверы и инструменты из экосистемы MongoDB.

Зачем это нужно разработчику?

Реклама
  1. Лучшее из двух миров: Вы получаете гибкость NoSQL для работы с документами со свободной схемой и одновременно всю мощь PostgreSQL: ACID-транзакции, сложнейшие запросы, развитые механизмы индексации и надежность, проверенную десятилетиями.
  2. Единая база данных: Вместо того чтобы поддерживать зоопарк из реляционной и документарной баз, вы можете хранить и те, и другие данные в одном месте. Это упрощает архитектуру, бэкапы и администрирование.
  3. Плавный переход: Если у вас уже есть приложение, работающее с MongoDB, вы можете переключить его на DocumentDB, просто изменив строку подключения. Никакой миграции кода!
  4. Полный контроль: Это полностью открытый проект под лицензией 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. Возможно, это именно то решение, которое вы так долго искали.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.