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}")