如何基于元素数量从PyMongo/MongoDB中查询文档?
MongoDB查询条件修正与验证
关于第三个条件的有效性
你当前使用的{"updatedCoordinates.status": {"$in":["ORIGINALLY_UNDETECTED","CHANGED"]}}完全符合“至少一个updatedCoordinates.status匹配目标值”的要求。MongoDB在处理数组嵌套字段查询时,只要数组内存在任意一个元素的status落在$in指定的列表中,就会返回该文档,这个逻辑是正确的。
第四个条件的正确写法
你原查询里的第四个条件语法错误,$ne不能直接以数组形式传入两个$size表达式。必须用$expr包裹聚合表达式来实现字段间的比较,正确写法如下:
{"$expr": {"$ne": [{"$size": "$updatedCoordinates"}, {"$size": "$predictedCoordinates"}]}}
$expr是让查询过滤器支持聚合运算符的关键$size需要带$前缀来引用文档中的数组字段,获取其长度$ne用于判断两个数组的长度是否不相等
修正后的完整查询代码
from datetime import datetime from_date = datetime(2022, 9, 25, 0, 1, 1, 0) to_date = datetime(2022, 9, 28, 23, 59, 59, 0) QUERY = { "$and": [ {"imageKey": {"$in": IDS}}, {"createdAt": {"$gte": from_date, "$lt": to_date}}, { "$or": [ {"updatedCoordinates.status": {"$in": ["ORIGINALLY_UNDETECTED", "CHANGED"]}}, {"$expr": {"$ne": [{"$size": "$updatedCoordinates"}, {"$size": "$predictedCoordinates"}]}} ] } ] } my_collection.count_documents(QUERY)
性能优势说明
直接通过MongoDB完成过滤比拉取全量数据后用Python验证高效得多:
- 减少不必要的网络数据传输,避免大量不符合条件的文档从数据库传到应用端
- 数据库可以利用
imageKey、createdAt等字段的索引优化查询速度,远快于应用端的内存过滤
内容的提问来源于stack exchange,提问作者Deshwal
相关产品推荐
相关产品推荐

