| import motor.motor_asyncio |
| import logging |
|
|
| |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger("MongoManager") |
|
|
| class MongoManager: |
| def __init__(self, uri: str, db_name: str): |
| """ |
| 初始化 MongoDB 连接 |
| :param uri: 你的 mongodb+srv:// 字符串 |
| :param db_name: 数据库名称 |
| """ |
| self.client = motor.motor_asyncio.AsyncIOMotorClient(uri) |
| self.db = self.client[db_name] |
| logger.info(f"Connected to MongoDB: {db_name}") |
|
|
| |
|
|
| async def set(self, collection: str, doc_id: any, data: dict): |
| """设置/覆盖数据 (id可以是数字、字符串或消息ID)""" |
| try: |
| return await self.db[collection].update_one( |
| {"_id": doc_id}, |
| {"$set": data}, |
| upsert=True |
| ) |
| except Exception as e: |
| logger.error(f"Set Error: {e}") |
|
|
| async def update(self, collection: str, doc_id: any, update_data: dict): |
| """局部更新数据 (只修改传入的字段)""" |
| try: |
| return await self.db[collection].update_one( |
| {"_id": doc_id}, |
| {"$set": update_data} |
| ) |
| except Exception as e: |
| logger.error(f"Update Error: {e}") |
|
|
| async def get(self, collection: str, doc_id: any): |
| """获取单个数据""" |
| try: |
| return await self.db[collection].find_one({"_id": doc_id}) |
| except Exception as e: |
| logger.error(f"Get Error: {e}") |
| return None |
|
|
| async def delete(self, collection: str, doc_id: any): |
| """删除单个数据""" |
| try: |
| return await self.db[collection].delete_one({"_id": doc_id}) |
| except Exception as e: |
| logger.error(f"Delete Error: {e}") |
|
|
| async def find_many(self, collection: str, query: dict = {}, limit: int = 10, sort_field: str = "_id"): |
| """获取多条数据 (默认按ID倒序,即拿最新的)""" |
| try: |
| cursor = self.db[collection].find(query).sort(sort_field, -1).limit(limit) |
| return await cursor.to_list(length=limit) |
| except Exception as e: |
| logger.error(f"FindMany Error: {e}") |
| return [] |
|
|
| async def inc(self, collection: str, doc_id: any, field: str, amount: int = 1): |
| """数字自增 (比如统计公告修改次数)""" |
| try: |
| return await self.db[collection].update_one( |
| {"_id": doc_id}, |
| {"$inc": {field: amount}}, |
| upsert=True |
| ) |
| except Exception as e: |
| logger.error(f"Increment Error: {e}") |
|
|