File size: 2,762 Bytes
3894d14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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}")