← Назад к курсу

MongoDB в Python: демо-приложение

Мы создадим простое консольное приложение для управления задачами (To-Do List) с использованием MongoDB.

Шаги:

  1. Установим pymongo: `pip install pymongo`
  2. Запустим MongoDB (локально или используем облачный вариант, например, MongoDB Atlas). Для простоты будем использовать локальный сервер.
  3. Напишем приложение, которое позволит:
    • Добавлять задачи
    • Просматривать все задачи
    • Отмечать задачи как выполненные
    • Удалять задачи

Примечание: Для работы с локальным MongoDB, убедитесь, что сервер MongoDB запущен (обычно на localhost:27017).

Структура документа задачи:
{
"title": "Название задачи",
"description": "Описание задачи",
"done": false # статус выполнения
}

Код приложения:
Установка:

pip install pymongo

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

from pymongo import MongoClient
from bson.objectid import ObjectId

# Подключение (по умолчанию: localhost:27017)
client = MongoClient("mongodb://localhost:27017/")
db = client.task_database  # Создаем БД
collection = db.tasks      # Коллекция = таблица

# Вставка документа
task = {
    "title": "Купить продукты",
    "description": "Молоко, хлеб, яйца",
    "done": False,
    "tags": ["shopping", "urgent"]
}
insert_result = collection.insert_one(task)
print("ID новой задачи:", insert_result.inserted_id)

# Поиск
task = collection.find_one({"title": "Купить продукты"})
print(task)

# Обновление
collection.update_one(
    {"_id": ObjectId(insert_result.inserted_id)},
    {"$set": {"done": True}}
)

# Удаление
collection.delete_one({"done": True})

2. Демо-приложение: Менеджер задач (консольное)

from pymongo import MongoClient
import sys

# Инициализация MongoDB
client = MongoClient("mongodb://localhost:27017/")
db = client.task_manager
tasks = db.tasks

def add_task():
    title = input("Название задачи: ")
    description = input("Описание: ")
    task = {"title": title, "description": description, "done": False}
    tasks.insert_one(task)
    print("✅ Задача добавлена!\n")

def list_tasks():
    print("\n--- СПИСОК ЗАДАЧ ---")
    for task in tasks.find():
        status = "✓" if task.get("done") else "✗"
        print(f"[{status}] {task['title']} (ID: {task['_id']})")
    print("--------------------\n")

def complete_task():
    task_id = input("Введите ID задачи: ")
    tasks.update_one({"_id": ObjectId(task_id)}, {"$set": {"done": True}})
    print("✔ Задача выполнена!\n")

def main():
    while True:
        print("1. Добавить задачу\n2. Список задач\n3. Отметить выполненной\n4. Выход")
        choice = input("Выберите действие: ")
        
        if choice == "1": add_task()
        elif choice == "2": list_tasks()
        elif choice == "3": complete_task()
        elif choice == "4": sys.exit()
        else: print("Ошибка ввода!\n")

if __name__ == "__main__":
    main()

3. Запуск приложения

  1. Запустите MongoDB:
    mongod  # На Windows: запустите службу MongoDB
    
  2. Сохраните код в файл task_manager.py
  3. Запустите:
    python task_manager.py
    

4. Особенности MongoDB для разработчика

  • Динамическая схема:
    # Можно добавить поле "deadline" без изменения схемы
    tasks.update_one({"_id": id}, {"$set": {"deadline": "2023-12-31"}})
    
  • Индексация:
    tasks.create_index("title")  # Ускорение поиска по заголовку
    
  • Агрегации:
    pipeline = [
        {"$match": {"done": False}},
        {"$group": {"_id": "$tags", "count": {"$sum": 1}}}
    ]
    print(list(tasks.aggregate(pipeline)))
    

5. Когда использовать MongoDB?

Идеально для:

  • Каталогов товаров (динамические атрибуты)
  • Пользовательских профилей (разная структура)
  • Логов приложений
  • Контент-менеджмент (CMS)

Не подходит для:

  • Финансовых транзакций (требуются JOIN и ACID)
  • Отчетности со сложными SQL-агрегациями

6. Советы по оптимизации

  1. Используйте проекции для выборки только нужных полей:
    tasks.find({}, {"title": 1, "done": 1})
    
  2. Ограничивайте выборку:
    tasks.find().limit(10)
    
  3. Настройте индексы для частых запросов.

Для промышленного использования:

  • Используйте MongoDB Atlas для облачного развертывания
  • Реализуйте обработку ошибок (try/except для операций с БД)
  • Добавьте валидацию схемы через db.create_collection("tasks", validator={...})