Pymongo使用find()查询MongoDB返回覆盖指定值列表的区间记录
正确查询写法
myValues = [5,6,7,8,9] myData = myMongoCollection.find({ "index": {"$gt": current_time - datetime.timedelta(minutes=5)}, "$expr": { "$anyElementTrue": { "$map": { "input": myValues, "as": "val", "in": { "$and": [ {"$gte": ["$$val", "$StartValue"]}, {"$lte": ["$$val", "$EndValue"]} ] } } } } })
实现逻辑说明
- 通过
$expr运算符在查询条件中使用聚合表达式,实现自定义的区间交集判断 - 用
$map遍历myValues中的每一个元素,逐一判断该元素是否落在当前记录的[StartValue, EndValue]闭区间内 - 用
$anyElementTrue判断遍历结果,只要有一个元素落在区间内,就满足匹配条件,完全符合你要求的「区间包含至少一个列表元素」的规则 - 该写法天然兼容你提到的
myValues=[5,6,7]这类场景,无需使用$in即可正确匹配区间[1,8]
原查询错误原因
- 语法错误:
$and操作符后需要接条件数组,而非嵌套对象 - 逻辑错误:原写法的实际生效逻辑是要求
StartValue大于等于所有myValues元素、EndValue小于等于所有myValues元素,和需求逻辑完全相反 - 运算符误用:
$or不能直接放在$gte/$lte等比较运算符后接数组,不符合MongoDB语法规范
该查询返回的所有记录会自动覆盖所有在数据集中存在对应区间的myValues元素,如果存在元素未被覆盖,说明你的集合中没有包含该元素的区间记录。
内容的提问来源于stack exchange,提问作者geekygeek
相关产品推荐
相关产品推荐

