MongoDB中键不一定存在时如何正确执行find_one查询操作
故障原因
三个问题导致查询不符合预期:
- 字段名不匹配:你给出的文档示例中数值字段名为
transaction,但查询代码中写的是transaction_id,二者不一致会导致匹配不到目标文档。如果实际存储字段确实为transaction_id,则是你贴出的文档示例存在笔误。 - 查询语法错误:Python字典中同名键会被后赋值的值覆盖,你写的
{'transaction_id': { "$exists":True }, 'transaction_id': 10}实际执行时会被解析为{'transaction_id': 10},$exists判断完全不生效。 - 性能问题:查询字段没有创建索引时,MongoDB会执行全集合扫描,当集合数据量较大时就会出现长时间等待、无法返回结果的情况。
正确实现方式
基础查询写法
MongoDB的等值查询本身就会自动跳过不存在查询字段的文档,不需要额外添加$exists判断,直接使用正确字段名写等值条件即可:
# 字段名以实际存储为准,示例为transaction,若实际是transaction_id替换即可 collection.find({'transaction': 10})
如果需要显式排除字段存在但值为null的场景,可以把$exists和等值判断合并到同一个字段的条件对象中,不要重复声明顶级键:
collection.find({ 'transaction': { "$exists": True, "$eq": 10 } })
性能优化(解决查询超时问题)
给查询字段创建单键索引,索引创建完成后等值查询的耗时会从全表扫描的O(n)级别降到O(log n)级别,彻底解决长时间无返回的问题:
# 后台创建索引,不会阻塞集合的正常读写操作 collection.create_index([("transaction", 1)], background=True)
等索引构建完成后再执行查询即可。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

