Spaces:
Paused
Paused
| import motor.motor_asyncio | |
| import logging | |
| # 设置简单的日志,方便你在 Render 控制台看到数据库报错 | |
| 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}") | |