Чтобы подключить Telegram-бота к MongoDB, создайте MongoDB-клиент один раз при старте бота, выберите базу и коллекцию, а в обработчиках команд записывайте или читайте документы. Если бот асинхронный, используйте асинхронный подход, чтобы запросы к базе не тормозили обработку сообщений
Пример на Python:
from pymongo import AsyncMongoClient
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
mongo = AsyncMongoClient("mongodb://localhost:27017")
db = mongo["telegram_bot"]
users = db["users"]
- Команда /start
- Запуск бота
- Как проверить запись
- Что хранить в базе
- Как подключать удаленную базу
- Частые ошибки
- Создают MongoDB-клиент в каждом обработчике
- Хранят telegram_id строкой и ищут числом
- Не используют upsert
- Публикуют токен бота
- Не создают индекс по telegram_id
- Что почитать дальше по MongoDB
- Как проверить результат на практике
Команда /start
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = update.effective_user
await users.update_one(
{"telegram_id": user.id},
{
"$set": {
"telegram_id": user.id,
"username": user.username,
"first_name": user.first_name,
}
},
upsert=True
)
await update.message.reply_text("Профиль сохранен в MongoDB.")
upsert=True обновит пользователя, если он уже есть, или создаст нового
Запуск бота
app = ApplicationBuilder().token("YOUR_BOT_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.run_polling()
Токен не храните в коде. Лучше положить его в переменную окружения
Как проверить запись
Откройте mongosh:
use telegram_bot
db.users.findOne()
Если после команды /start появился документ с telegram_id, связь работает
Что хранить в базе
Для начала хватит telegram_id, username, имени, даты первого входа и настроек пользователя. Не храните лишние персональные данные без необходимости. Если бот делает заказы, подписки или напоминания, храните эти сущности в отдельных коллекциях
Пример документа пользователя:
{
telegram_id: 123456789,
username: "dinar",
first_name: "Dinar",
createdAt: new Date(),
settings: {
notifications: true
}
}
Для быстрых поисков добавьте уникальный индекс:
db.users.createIndex({ telegram_id: 1 }, { unique: true })
Так один пользователь не появится в коллекции несколько раз
Как подключать удаленную базу
Если MongoDB находится не на вашем компьютере, строку подключения храните в переменной окружения:
import os
mongo = AsyncMongoClient(os.environ["MONGODB_URI"])
Не вставляйте логин, пароль и токен бота прямо в файл. Это частая ошибка в учебных ботах, которые потом случайно попадают в публичный репозиторий
Частые ошибки
Создают MongoDB-клиент в каждом обработчике
Так бот будет открывать лишние подключения. Создавайте клиент один раз
Хранят telegram_id строкой и ищут числом
Выберите один тип. Обычно telegram_id удобно хранить числом
Не используют upsert
Без upsert повторный /start может создавать неудобную логику. Обновление по telegram_id проще
Публикуют токен бота
Токен Telegram-бота храните в переменных окружения и не коммитьте в репозиторий
Не создают индекс по telegram_id
Если бот часто ищет пользователя по Telegram ID, индекс ускорит такие проверки и защитит от повторов
После первого запуска проверьте коллекцию вручную. Один пользователь должен иметь один документ, а повторный /start должен обновлять его, а не создавать новую запись
Что почитать дальше по MongoDB
Если нужен общий маршрут по теме, откройте рубрику MongoDB. Для соседних задач пригодятся эти разборы:
- PyMongo: как подключить Python к MongoDB и выполнить первый CRUD
- Discord bot на Python и MongoDB: как задать проверку
- Failed to start MongoDB database server: что проверить
- MongoDB Atlas: облачная база для первого проекта
Как проверить результат на практике
Для MongoDB-материала полезно делать три проверки: сначала выполнить команду на маленьком наборе тестовых документов, затем посмотреть результат через find() или MongoDB Compass, а после этого повторить действие на копии реальной структуры данных. Если запрос меняет документы, сначала запускайте его с фильтром на один документ и только потом расширяйте условие
Еще одна хорошая привычка — записывать исходное состояние и ожидаемый результат. Например: было три документа, после обновления изменился только один; был массив из пяти элементов, после операции остался нужный элемент; индекс появился в getIndexes(). Такая проверка быстро показывает, что вы исправили именно задачу, а не просто получили команду без ошибки



