Урок 84. MongoDB и Python. Модули

📁 Блок: Базы данных и модули ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя
#close #find #sort #list #in #import #from

⚡ Кратко: примеры кода

  • Подключись через MongoClient, проверь соединение командой ping.
  • Выбери базу и коллекцию через квадратные скобки.
  • Добавляй документы методами insert_one и insert_many.
  • Читай данные через find_one и find, настраивай сортировку, лимит и проекцию.
  • Обновляй через $set и $inc, удаляй через delete_one / delete_many.
  • Оборачивай работу с базой в try ... except pymongo.errors.
  • Разделяй код на модули и используй if __name__ == "__main__".

💻 Рабочие примеры

Все примеры предполагают, что у вас есть доступ к серверу MongoDB. Замените строку подключения на свою.

Пример 1. Подключение и проверка

Файл: 01_connect.py

from pymongo import MongoClient

client = MongoClient(
    "mongodb://ich_editor:verystrongpassword"
    "@mongo.itcareerhub.de/?readPreference=primary"
    "&ssl=false&authMechanism=DEFAULT&authSource=ich_edit"
)

try:
    client.admin.command("ping")
    print("Connection successful!")
finally:
    client.close()

Пример 2. Выбор базы и коллекции

Файл: 02_select_db.py

from pymongo import MongoClient

client = MongoClient("mongodb://...")
db = client["ich_edit"]
products = db["products"]

print("Database:", db.name)
print("Collection:", products.name)

client.close()

Пример 3. Добавление документов

Файл: 03_insert.py

from pymongo import MongoClient

client = MongoClient("mongodb://...")
products = client["ich_edit"]["products"]

# Один документ
product = {"name": "Notebook", "price": 5.99, "stock": 120}
result = products.insert_one(product)
print("Inserted ID:", result.inserted_id)

# Несколько документов
items = [
    {"name": "Pen", "price": 1.50, "stock": 300},
    {"name": "Pencil", "price": 0.99, "stock": 500},
    {"name": "Eraser", "price": 0.75, "stock": 200},
]
result = products.insert_many(items)
print("Inserted IDs:", result.inserted_ids)

client.close()

Пример 4. Чтение документов

Файл: 04_find.py

from pymongo import MongoClient

client = MongoClient("mongodb://...")
products = client["ich_edit"]["products"]

# Один документ
first = products.find_one()
print("First:", first)

# Все документы дешевле 5
print("Cheap products:")
for doc in products.find({"price": {"$lt": 5}}):
    print(doc)

# Сортировка, пропуск, лимит
print("Top 2 by price:")
for doc in products.find().sort("price", -1).limit(2):
    print(doc)

client.close()

Пример 5. Проекция полей

Файл: 05_projection.py

from pymongo import MongoClient

client = MongoClient("mongodb://...")
products = client["ich_edit"]["products"]

# Только name и price
for doc in products.find({}, {"name": 1, "price": 1}):
    print(doc)

# Без _id
for doc in products.find({}, {"_id": 0}):
    print(doc)

client.close()

Пример 6. Обновление документов

Файл: 06_update.py

from pymongo import MongoClient

client = MongoClient("mongodb://...")
products = client["ich_edit"]["products"]

# Изменить цену одного товара
result = products.update_one(
    {"name": "Notebook"},
    {"$set": {"price": 24.99}}
)
print("Matched:", result.matched_count)
print("Modified:", result.modified_count)

# Увеличить цену всех товаров на 1
result = products.update_many(
    {},
    {"$inc": {"price": 1}}
)
print("Modified all:", result.modified_count)

client.close()

Пример 7. Удаление документов

Файл: 07_delete.py

from pymongo import MongoClient

client = MongoClient("mongodb://...")
products = client["ich_edit"]["products"]

# Удалить один документ
result = products.delete_one({"name": "Notebook"})
print("Deleted one:", result.deleted_count)

# Удалить все дешёвые товары
result = products.delete_many({"price": {"$lt": 2}})
print("Deleted many:", result.deleted_count)

client.close()

Пример 8. Обработка ошибок

Файл: 08_errors.py

from pymongo import MongoClient, errors

client = MongoClient(
    "mongodb://ich_editor:wrong_pass@mongo.itcareerhub.de/?authSource=ich_edit"
)

try:
    db = client["store"]
    products = db["products"]
    products.insert_one({"name": "Lamp", "price": 15.99})
except errors.ConnectionFailure:
    print("Ошибка подключения к MongoDB")
except errors.OperationFailure:
    print("Ошибка авторизации или запроса")
except errors.PyMongoError as e:
    print("Общая ошибка pymongo:", e)
finally:
    client.close()

Пример 9. Пользовательский модуль

Файл: math_utils.py

def average(numbers):
    return sum(numbers) / len(numbers)


def maximum(numbers):
    return max(numbers)


if __name__ == "__main__":
    values = [10, 20, 30]
    print("Average:", average(values))
    print("Maximum:", maximum(values))

Файл: main.py

import math_utils
from math_utils import maximum

values = [10, 20, 30]
print(math_utils.average(values))
print(maximum(values))

Пример 10. Структура пакета

Структура папок:

modules/
├── main.py
├── math_utils.py
├── analyzer.py
└── tools/
    ├── __init__.py
    ├── text_utils.py
    └── helpers/
        ├── __init__.py
        └── string_tools.py

Файл: tools/text_utils.py

def count_words(text):
    return len(text.split())

Файл: tools/helpers/string_tools.py

def reverse(text):
    return text[::-1]

Файл: tools/__init__.py

from .text_utils import count_words
from .helpers.string_tools import reverse

Файл: analyzer.py

import tools

text = "What a beautiful day to learn Python!"
print(tools.count_words(text))
print(tools.reverse(text))
⚠️ Проверить по документации: в реальных проектах для управления зависимостями и виртуальными окружениями используют venv или poetry. Для MongoDB существуют также ODM-библиотеки, такие как mongoengine и beanie.