You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Motor异步动态创建MongoDB集合索引?

解决MongoDB动态创建索引的集合实例访问问题

你当前的核心问题是误用了ast.literal_eval——这个方法只能解析Python字面量(比如字符串、列表、字典),根本无法执行方法调用。而且拼接字符串执行代码的思路本身就不安全,完全没必要。用getattr就能安全地动态获取集合实例,下面是修正后的实现:

修正后的代码

首先确保导入ASCENDING:

from pymongo import ASCENDING
from models.database_models import IndexedKeyModels

然后修改set_indexes方法:

async def set_indexes(self) -> None:
    test_prefix = "test_" if self.dev == "True" else ""
    # 遍历IndexedKeyModels的字段和对应的索引键
    for collection_name, index_key in IndexedKeyModels().model_dump().items():
        # 动态获取集合实例
        collection = getattr(self, f"{test_prefix}{collection_name}")
        # 调用创建索引的方法
        await collection.create_index(
            [(index_key, ASCENDING)], 
            background=True
        )

关键说明

  • 用model_dump()(Pydantic v2)或dict()(Pydantic v1)把IndexedKeyModels实例转成字典,直接拿到集合名和对应的索引键,不用手动处理元组遍历。
  • getattr(self, 集合名)是安全的动态属性访问方式,完全替代了字符串拼接执行代码的危险操作。
  • 代码逻辑更清晰,去掉了不必要的字符串拼接和错误的ast.literal_eval调用。

额外优化建议

  • 把self.dev == "True"改成self.dev is True或者直接self.dev(如果dev是布尔类型的话),避免字符串和布尔值的错误比较。
  • 如果集合名称前缀逻辑更复杂,可以单独抽成一个小函数,提高代码可读性。

内容的提问来源于stack exchange,提问作者Ryan Burch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:01:20