Создание коллекций MongoDB с помощью Python
Узнайте, как создавать коллекции MongoDB в Python с помощью pymongo — явное и неявное создание, ограниченные коллекции, валидаторы и получение списка коллекций.
Коллекция — это аналог таблицы в реляционной базе данных, но в MongoDB. Она хранит группу документов (объекты, похожие на JSON) и принадлежит одной базе данных. В этой главе показаны два способа создать коллекцию с помощью драйвера pymongo для Python — явно через create_collection() и неявно путём вставки первого документа — а также параметры коллекций: ограниченные коллекции и схемы-валидаторы.
Предварительные требования
Прежде чем продолжить, убедитесь, что у вас установлены:
- Python 3.7 или более поздней версии
pymongo(pip install pymongo)- Работающий экземпляр MongoDB — либо MongoDB Atlas (облако), либо локальный сервер, запущенный командой
mongod
Полное руководство по настройке смотрите в разделе MongoDB Get Started, а о работе с базами данных в MongoDB — в MongoDB Create Database.
Подключение к MongoDB
Каждая коллекция находится внутри базы данных, поэтому первым шагом всегда является получение дескриптора базы данных.
Подключение к локальному серверу MongoDB и выбор базы данных
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mystore"] # selects (or lazily creates) the databaseДля подключения к MongoDB Atlas замените строку подключения на ту, что указана в вашей панели управления Atlas:
client = pymongo.MongoClient(
"mongodb+srv://<username>:<password>@cluster0.example.mongodb.net/"
)
db = client["mystore"]Замените <username>, <password> и хост на ваши реальные учётные данные.
Явное создание коллекции
Используйте create_collection(), когда нужно управлять параметрами коллекции при её создании (ограниченный размер, валидация схемы, сравнение строк и т. д.).
Явное создание коллекции
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mystore"]
collection = db.create_collection("customers")
print("Collection created:", collection.name)
# Collection created: customerscreate_collection() вызывает pymongo.errors.CollectionInvalid, если коллекция с таким именем уже существует. Обработайте это с помощью try/except:
Обработка случая, когда коллекция уже существует
from pymongo.errors import CollectionInvalid
try:
collection = db.create_collection("customers")
print("Created:", collection.name)
except CollectionInvalid:
print("Collection already exists — using existing one")
collection = db["customers"]Правила именования коллекций
Имена коллекций MongoDB должны соответствовать следующим требованиям:
- Не быть пустой строкой
- Не содержать символ
$или нулевой символ (\0) - Не начинаться с
system.(этот префикс зарезервирован) - Не превышать 120 байт в сочетании с именем базы данных и разделителем-точкой
Допустимые имена: customers, order_items, 2024_logs. Недопустимые имена: $orders, system.users.
Неявное создание коллекции
Самый распространённый подход в повседневной разработке — позволить MongoDB автоматически создать коллекцию при вставке первого документа. Если коллекция не существует, MongoDB создаёт её на лету.
Неявное создание коллекции путём вставки документа
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mystore"]
products = db["products"] # no round-trip to the server yet
result = products.insert_one({"name": "Widget", "price": 9.99, "stock": 100})
print("Inserted ID:", result.inserted_id)
# Inserted ID: 6650a1b2c3d4e5f678901234 (an ObjectId — yours will differ)Присвоение db["products"] является чисто локальным; MongoDB создаёт коллекцию только тогда, когда вызов insert_one() достигает сервера.
Ограниченные коллекции
Ограниченная коллекция (capped collection) — это кольцевой буфер фиксированного размера. Когда она достигает своего предела, MongoDB автоматически перезаписывает самые старые документы. Это делает ограниченные коллекции идеальными для логов, журналов аудита и потоков событий.
Создание ограниченной коллекции (не более 1 МБ, не более 1000 документов)
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mystore"]
logs = db.create_collection(
"access_logs",
capped=True,
size=1_048_576, # maximum size in bytes (1 MB) — required for capped collections
max=1000, # optional: maximum number of documents
)
print("Capped collection created:", logs.name)
# Capped collection created: access_logsОсновные правила ограниченных коллекций:
sizeобязателен, еслиcapped=True;max— опционален.- Ограниченную коллекцию нельзя сегментировать (шардировать).
- Документы в ограниченной коллекции не могут увеличиваться сверх исходного размера при обновлении (заполнение добавляется автоматически, но размер слота фиксирован).
Добавление валидатора схемы
Валидация схемы MongoDB позволяет принудительно задавать структуру документа на уровне базы данных. Правила валидации задаются в виде JSON Schema.
Создание коллекции с валидатором JSON Schema
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mystore"]
validator = {
"$jsonSchema": {
"bsonType": "object",
"required": ["name", "price"],
"properties": {
"name": {"bsonType": "string", "description": "must be a string"},
"price": {"bsonType": "double", "description": "must be a number"},
"stock": {"bsonType": "int", "description": "must be an integer"},
},
}
}
orders = db.create_collection("orders", validator=validator)
print("Collection with validator created:", orders.name)
# Collection with validator created: ordersКогда validationAction имеет значение по умолчанию ("error"), MongoDB отклоняет любую вставку или обновление, нарушающее схему. Установите значение "warn", чтобы записывать нарушения в журнал без отклонения записей.
Получение списка коллекций
Чтобы узнать, какие коллекции существуют в базе данных, используйте list_collection_names(). Это также удобный способ проверить, существует ли коллекция, прежде чем вызывать create_collection().
Вывод всех коллекций в базе данных
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mystore"]
names = db.list_collection_names()
print(names)
# ['customers', 'products', 'orders', 'access_logs']Проверка существования коллекции перед её созданием
if "customers" not in db.list_collection_names():
db.create_collection("customers")
print("Created customers collection")
else:
print("customers already exists")list_collection_names() возвращает обычный список Python, поэтому к результату применимы любые операции со списками.
Выбор между явным и неявным созданием
| Ситуация | Рекомендуемый подход |
|---|---|
| Нужен ограниченный размер, валидатор или пользовательское сравнение строк | create_collection() с параметрами |
| Нужно гарантировать существование коллекции перед записью | create_collection() + защита через CollectionInvalid |
| Нужно просто место для хранения документов | Неявное — вставьте документ и позвольте MongoDB создать коллекцию |
| Нужно проверить существование без создания | list_collection_names() |
Следующие шаги
Теперь, когда коллекция готова, можно начать работать с документами:
- MongoDB Insert — добавление одного или нескольких документов с помощью
insert_one()иinsert_many() - MongoDB Find — запрос документов из коллекции
- MongoDB Drop Collection — удаление коллекции, когда она больше не нужна