Как подключить Telegram-бота к MongoDB

Чтобы подключить 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

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. Для соседних задач пригодятся эти разборы:

Как проверить результат на практике

Для MongoDB-материала полезно делать три проверки: сначала выполнить команду на маленьком наборе тестовых документов, затем посмотреть результат через find() или MongoDB Compass, а после этого повторить действие на копии реальной структуры данных. Если запрос меняет документы, сначала запускайте его с фильтром на один документ и только потом расширяйте условие

Еще одна хорошая привычка — записывать исходное состояние и ожидаемый результат. Например: было три документа, после обновления изменился только один; был массив из пяти элементов, после операции остался нужный элемент; индекс появился в getIndexes(). Такая проверка быстро показывает, что вы исправили именно задачу, а не просто получили команду без ошибки

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x