一、问题现象与背景
在使用MongoDB的Python驱动pymongo时,create_indexes方法是构建数据库性能优化的关键操作。开发者常遇到以下错误提示:
pymongo.errors.OperationFailure: Command failed: cannot create index...
二、核心问题分析
2.1 连接配置问题
- 连接字符串未包含authSource参数
- TCP连接超时(默认30秒)
- SSL证书验证失败
2.2 权限不足场景
| 所需权限 | 对应操作 |
|---|---|
| createIndex | 基础索引创建 |
| userAdmin | 系统集合操作 |
2.3 索引规范错误
典型错误示例:
# 错误:使用Python字典而非方向标识符
db.collection.create_indexes([{"name": 1}])
# 正确写法
from pymongo import ASCENDING
db.collection.create_indexes([("name", ASCENDING)])
三、解决方案实施
3.1 连接参数优化
client = MongoClient(
host="cluster.mongodb.net",
socketTimeoutMS=60000,
ssl_ca_certs="/path/to/cert.pem"
)
3.2 权限矩阵配置
通过MongoShell授予权限:
db.grantRolesToUser("user", [
{role: "dbAdmin", db: "target_db"}
])
3.3 批量索引创建最佳实践
- 使用
maxTimeMS控制超时 - 通过
commitQuorum设置副本集确认数
四、完整代码示例
from pymongo import MongoClient, ASCENDING, DESCENDING
client = MongoClient(connectTimeoutMS=5000)
collection = client["mydb"]["articles"]
try:
collection.create_indexes([
("title", DESCENDING),
("author", ASCENDING),
[("publish_date", ASCENDING), ("category", DESCENDING)]
], maxTimeMS=10000)
except Exception as e:
print(f"索引创建失败: {e.__class__.__name__}: {e}")
五、性能监控建议
创建后使用explain()验证索引效果:
print(collection.find({"author": "John"}).explain()["executionStats"])