← Назад к вопросам

Как устроена MongoDB?

2.0 Middle🔥 121 комментариев
#Базы данных (NoSQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как устроена MongoDB

MongoDB — это NoSQL документоориентированная база данных. Вот основная архитектура:

Иерархия структуры

MongoDB Server
  └── Database
       └── Collection
            └── Document (JSON-like)

Database — логический контейнер. На одном сервере несколько БД. Collection — аналог таблицы в SQL. Хранит документы. Document — JSON-like объект (BSON). Это основная единица хранения.

Документ (BSON)

Kаждый документ — это иерархическая структура:

{
  "_id": ObjectId("507f1f77bcf86cd799439011"),
  "name": "John",
  "email": "john@example.com",
  "age": 30,
  "active": true,
  "tags": ["python", "mongodb"],
  "profile": {
    "bio": "Developer",
    "verified": true
  }
}
  • _id — уникальный идентификатор (ObjectId по умолчанию)
  • Данные хранятся в BSON (Binary JSON)
  • Каждый документ может иметь разную структуру (schema-less)
  • Поддерживает вложенные объекты и массивы

Основные операции

from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017")
db = client["myapp"]
users_collection = db["users"]

# Create (Insert)
user = {"name": "Alice", "email": "alice@example.com"}
result = users_collection.insert_one(user)
print(result.inserted_id)  # ObjectId

# Read (Find)
user = users_collection.find_one({"email": "alice@example.com"})
all_users = list(users_collection.find({"age": {"$gt": 25}}))

# Update
users_collection.update_one(
    {"_id": result.inserted_id},
    {"$set": {"age": 31}}
)

# Delete
users_collection.delete_one({"email": "alice@example.com"})

Индексы

Ускоряют поиск:

# Создать индекс
users_collection.create_index("email", unique=True)
users_collection.create_index([("name", 1), ("age", -1)])

# Посмотреть индексы
for index in users_collection.list_indexes():
    print(index)

Репликация (Replica Set)

МongoDB использует replica sets для отказоустойчивости:

Primary (читает и пишет)
├── Secondary 1 (синхронизирует данные из Primary)
└── Secondary 2 (синхронизирует данные из Primary)

Если Primary падает, один из Secondary становится новым Primary.

Шардинг (Sharding)

Для горизонтального масштабирования:

Config Servers (метаданные)
Query Router (mongos)
  ├── Shard 1 (часть данных)
  ├── Shard 2 (часть данных)
  └── Shard 3 (часть данных)

Данные распределяются по шардам на основе ключа шардирования.

Отличия от SQL

ХарактеристикаMongoDBSQL
МодельДокументТаблица
СхемаГибкая (schema-less)Строгая
ТранзакцииС версии 4.0 (multi-document)Встроены
СоединенияНет (денормализация)JOIN
МасштабированиеHorizontal (шардинг)Vertical

Агрегация (Pipeline)

Аналог GROUP BY в SQL:

pipeline = [
    {"$match": {"status": "active"}},
    {"$group": {"_id": "$category", "count": {"$sum": 1}}},
    {"$sort": {"count": -1}},
    {"$limit": 10}
]

result = users_collection.aggregate(pipeline)
for doc in result:
    print(doc)

Типичные случаи использования

  • Content Management Systems — гибкая структура документов
  • Real-time Analytics — быстрая запись больших объёмов
  • IoT Applications — шардинг для масштабирования
  • User Profiles — вложенные структуры для профилей

MongoDB отличный выбор, когда нужна гибкость в структуре данных и горизонтальное масштабирование.