Python连接MongoDB开发需以查询模式为中心设计文档模型并合理建索引:高频字段嵌入同文档,避免深层嵌套;索引按查询条件创建,遵循前缀匹配原则;PyMongo应复用连接、批量写入、启动时异步建索引,并用explain验证命中率。
Python连接MongoDB做开发,核心在于理解文档模型的设计逻辑和索引的实际作用——不是堆字段、也不是盲目建索引,而是围绕查询模式来组织数据和加速访问。
MongoDB不强制预定义结构,但随意嵌套或拆分会导致查询低效或应用层复杂度飙升。关键原则是:高频查询的字段尽量放在同一文档内,避免多次查询或应用层JOIN。
user_id或order_id关联user.address.city.zipcode),4层以内较稳妥;路径过深会影响索引效率和可读性MongoDB索引本质是B-tree结构,只有匹配查询条件的字段顺序、类型和操作符(如$eq、$gt)才能命中。Python中用create_index()前,先看explain()输出。
{'status': 'paid'})建单字段索引;范围查询({'created_at': {'$gt': ...}})适合放复合索引末位db.orders.create_index([('user_id', 1), ('status', 1), ('created_at', -1)]) 可支撑{'user_id': 123}、{'user_id': 123, 'status': 'shipped'}、{'user_id': 123, 'status': 'shipped', 'created_at': {'$lt': ...}},但无法加速仅查status或created_at的查询{$regex: '^abc'},可建普通索引;但{$regex: 'abc'}(无开头锚定)无法使用索引,应改用全文索引或应用层过滤使用PyMongo时,连接池、写关注(write concern)和索引声明时机直接影响稳定性与性能。
MongoClient(host='...', maxPoolSize=100)全局实例,不要每次操作都新建client;配合with上下文管理器控制session(如需事务)collection.insert_many(docs, ordered=False)比循环insert_one快数倍;ordered=False允许部分失败继续执行collection.create_index('email', unique=True),并加
background=True避免阻塞线上服务;生产环境禁用drop_databases类危险操作很多性能问题源于“以为索引生效”,实际未命中。上线前必须验证。
collection.find(...).explain('executionStats')检查nReturned是否接近totalDocsExamined——若后者远大于前者,说明扫描过多文档,索引无效或缺失$lookup不走索引?确保被关联集合的foreignField已建索引,且类型一致(如字符串不能和ObjectId混用)$set大量字段时可能引发短暂锁竞争,可考虑upsert=True合并读写