ACSimBot / mongo.py
tonydong365
Develop first time
3894d14
Raw
History Blame Contribute Delete
2.76 kB
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}")