pymongo.insert_one是否保证文档可用性?插入后立即查询能否获取?
关于pymongo.insert_one的文档可用性问题
1. pymongo.insert_one是否能保证文档的可用性?
这个问题核心取决于你配置的写入关注点(write concern):
- 默认情况下,pymongo的
insert_one使用w=1的写入关注点——意思是只有当主节点(单节点部署就是当前唯一节点,副本集场景就是主节点)确认文档已写入内存(若开启journal日志,也会同步写入journal)后,才会返回插入结果。这种场景下,在主节点上,文档是立即可用的。 - 如果你手动将写入关注点设为
w=0(不要求任何节点确认写入),insert_one会直接返回插入ID,但此时文档可能还在后台排队写入,这时候就无法保证文档的可用性,后续查询大概率找不到。 - 要是在副本集环境中设置
w>1(比如要求主节点+至少一个副本节点确认写入),那返回ID时,指定的所有节点都已完成写入,文档在这些节点上都是可用的。
2. 插入后立即执行find_one是否能查到文档?
针对你给出的这段代码:
id = mongo.database.collection.insert_one(document).inserted_id document = mongo.database.collection.find_one({"_id": id})
在默认的w=1写入关注点下,完全可以保证后续能查到这个文档。因为insert_one返回inserted_id的前提是主节点已经确认写入完成,此时同一个主节点上的find_one查询肯定能获取到刚插入的文档。
但以下特殊情况可能导致查不到:
- 你把写入关注点改成了
w=0,此时insert_one直接返回ID,但实际写入操作还没完成,find_one会返回None。 - 查询请求被路由到了副本集的从节点,而从节点还没同步完主节点的写入数据。这种情况下去从节点查不到,但直接查主节点就不会有问题。
内容的提问来源于stack exchange,提问作者keddad
相关产品推荐
相关产品推荐

