Этот проект предоставляет универсальное решение для подключения к MongoDB сервису, как локально для разработки, так и удаленно в продакшене.
mongo_service/
├── docker-compose.yml # Docker Compose конфигурация MongoDB
├── mongo-init/ # Скрипты инициализации MongoDB
│ └── init-mongo.js # Скрипт создания пользователей и баз
├── mongo_service/ # Основной модуль
│ ├── __init__.py
│ ├── config.py # Конфигурация подключения
│ ├── mongo_connection.py # Основной модуль подключения
│ └── fastapi_integration.py # Интеграция с FastAPI
├── tests/ # Тесты
│ ├── __init__.py
│ ├── test_config.py
│ └── test_mongo_connection.py
├── secured_mongo_connection.py # Безопасная версия модуля подключения
├── performance_optimizer.py # Модуль оптимизации производительности
├── secured_example_fastapi_app.py # Пример FastAPI с улучшенной безопасностью
├── vim_integration.py # Интеграция с vi/vim редакторами
├── ANALYSIS.md # Анализ проекта и рекомендации
├── requirements.txt
├── requirements-dev.txt
└── README.md
docker-compose up -d
MongoDB будет доступна на localhost:27017 для локальной разработки.
from mongo_service.mongo_connection import MongoConnection, MongoService
# Создаем подключение
connection = MongoConnection(
host='localhost',
port=27017,
username='project1_user',
password='project1_pass',
database='project1_db'
)
# Подключаемся к MongoDB
if await connection.connect():
# Создаем сервис для работы с коллекциями
service = MongoService(connection)
# Выполняем операции
doc_id = await service.insert_one("my_collection", {
"name": "example",
"value": 123
})
if doc_id:
print(f"Документ вставлен с ID: {doc_id}")
# Закрываем подключение
await connection.disconnect()
from mongo_service.mongo_connection import create_mongo_connection_from_env
from mongo_service.mongo_connection import MongoService
# Создаем подключение из переменных окружения
connection = await create_mongo_connection_from_env()
if await connection.connect():
service = MongoService(connection)
# Работа с коллекциями...
await connection.disconnect()
ВАЖНО: Пользователи MongoDB создаются в соответствующих базах данных, а не в admin базе. Для аутентификации используйте authSource, совпадающий с базой данных пользователя:
MONGO_AUTH_SOURCE=default_dbMONGO_AUTH_SOURCE=project1_dbMONGO_AUTH_SOURCE=project2_dbfrom mongo_service.config import ProjectConfig
from mongo_service.mongo_connection import MongoConnection, MongoService
# Для проекта с именем 'my_project'
project_config = ProjectConfig('my_project')
# Получаем конфигурацию
config = project_config.get_config()
# Создаем подключение
connection = MongoConnection(
host=config.host,
port=config.port,
username=config.username,
password=config.password,
database=config.database
)
# Подключаемся и работаем...
MONGO_HOST - хост MongoDB (по умолчанию localhost)MONGO_PORT - порт MongoDB (по умолчанию 27017)MONGO_USERNAME - имя пользователя (по умолчанию default_user)MONGO_PASSWORD - пароль (по умолчанию default_pass)MONGO_DATABASE - имя базы данных (по умолчанию default_db)MONGO_AUTH_SOURCE - источник аутентификации (по умолчанию admin)MONGO_TIMEOUT - таймаут подключения (по умолчанию 5000 мс)MONGO_URI - полный URI подключенияMY_PROJECT_MONGO_HOSTMY_PROJECT_MONGO_PORTMY_PROJECT_MONGO_USERNAMEMY_PROJECT_MONGO_PASSWORDMY_PROJECT_MONGO_DATABASEMY_PROJECT_MONGO_AUTH_SOURCEMY_PROJECT_MONGO_TIMEOUTMY_PROJECT_MONGO_URIMONGO_REMOTE_URI - удаленный URI подключенияMONGO_REMOTE_HOSTMONGO_REMOTE_PORTMONGO_REMOTE_USERNAMEMONGO_REMOTE_PASSWORDMONGO_REMOTE_DATABASEMONGO_REMOTE_AUTH_SOURCEfrom fastapi import FastAPI, Depends
from mongo_service.fastapi_integration import get_mongo_lifespan, get_mongo_service
from mongo_service.mongo_connection import MongoService
app = FastAPI(lifespan=get_mongo_lifespan(app))
@app.get("/items")
async def get_items(mongo_service: MongoService = Depends(get_mongo_service)):
items = await mongo_service.find_many("items", {})
return {"items": items}
ВАЖНО: Убедитесь, что переменные окружения установлены правильно, особенно MONGO_AUTH_SOURCE,
который должен совпадать с базой данных пользователя:
MONGO_AUTH_SOURCE=default_db для подключения к default_dbMONGO_AUTH_SOURCE=project1_db для подключения к project1_dbMONGO_AUTH_SOURCE=project2_db для подключения к project2_db# Активировать виртуальное окружение
source venv/bin/activate
# Запустить все тесты
python -m pytest tests/
# Запустить тесты с детальным выводом
python -m pytest tests/ -v
Для работы с MongoDB из vi/vim редакторов, проект предоставляет специальный модуль интеграции:
:!python vim_integration.py connect
:!python vim_integration.py find_one my_collection '{"name": "test"}'
:!python vim_integration.py find_many my_collection '{"status": "active"}'
:!python vim_integration.py insert_one my_collection '{"name": "new_item", "value": 123}'
:!python vim_integration.py connect project1
Также можно использовать прямые команды MongoDB из vi/vim:
:!mongo --host localhost --port 27017 -u project1_user -p project1_pass --authenticationDatabase project1_db
Или если установлен mongosh:
:!mongosh "mongodb://project1_user:project1_pass@localhost:27017/project1_db?authSource=project1_db"
ВАЖНО: Для правильной аутентификации используйте authSource, совпадающий с базой данных пользователя:
authSource=default_dbauthSource=project1_dbauthSource=project2_dbMongoDB инициализируется с несколькими базами данных для разных проектов:
project1_db - для проекта 1project2_db - для проекта 2default_db - база по умолчаниюКаждая база данных имеет своего пользователя с соответствующими правами доступа.
Проект включает в себя несколько улучшений безопасности:
Для использования безопасной версии подключения:
from secured_mongo_connection import MongoConnection, MongoService
# Использование аналогично основному модулю, но с улучшенной безопасностью
connection = await create_mongo_connection_from_env() # из secured_mongo_connection
Проект включает модуль оптимизации производительности:
Пример использования:
from performance_optimizer import CachedMongoService, ConnectionPool, PerformanceOptimizer
# Использование сервиса с кэшированием
cached_service = CachedMongoService(connection, cache_ttl=300)
# Использование пула соединений
pool_config = ConnectionPoolConfig(min_connections=2, max_connections=10)
pool = ConnectionPool(connection_config, pool_config)
Для удаленного доступа используйте:
MONGO_URI или MONGO_REMOTE_URI с полным URI подключения