如何在PyMongo的find方法中用条件语句查询未通过test2的文档ID
问题分析与解决
原查询的问题
你的代码存在两个关键错误:
find()参数顺序错误:find()的第一个参数是筛选文档的查询条件,第二个参数才是控制返回字段的投影规则。你把"_id": 0放在了第一个参数里,MongoDB会将其视为查询条件而非字段过滤规则,完全偏离了你的需求。- 错误滥用聚合操作符:
$cond是聚合阶段专用的操作符,不能直接在find()的投影逻辑中这么使用。这种写法会让MongoDB尝试解析一个以$开头的字段名,而MongoDB禁止字段名以$开头,因此触发了FieldPath field names may not start with '$'的错误。
高效的正确查询方案
最直接且性能最优的写法,是直接匹配test_results.test2等于0的文档,同时指定只返回identifier字段:
list(mycol.find( {"test_results.test2": 0}, # 查询条件:筛选test2未通过(值为0)的文档 {"identifier": 1, "_id": 0} # 投影规则:只返回identifier,不返回默认的_id字段 ))
如果因特殊场景必须使用$expr(比如需要动态计算匹配条件),也可以这么写,但完全没必要——上面的写法性能更优:
list(mycol.find( {"$expr": {"$eq": ["$test_results.test2", 0]}}, {"identifier": 1, "_id": 0} ))
为什么这个方案高效
直接匹配字段值的查询可以利用test_results.test2上的索引(如果已创建),查询性能远高于使用$expr的方式。$expr会绕开常规的字段索引匹配逻辑,仅适用于复杂计算场景,常规匹配优先用直接字段筛选。
内容的提问来源于stack exchange,提问作者SC990987
相关产品推荐
相关产品推荐

