如何用PyMongo对MongoDB中字符串类型数值执行范围查询?
MongoDB 范围查询实现方案
首先纠正你代码里的一个笔误:文档中的嵌套字段是p1,但你写的是pl,这会导致查询不到数据,先把这个错误修正。
接下来针对你的范围查询需求,分两种情况给出解决方案:
情况1:字符串格式的数值(固定两位小数)
因为你的温度、湿度都是字符串类型,且格式统一为两位小数,直接用MongoDB的比较操作符$gt(大于)和$lt(小于)就能实现范围查询:
# 构建查询条件:温度在(10.00,16.00),湿度在(20.00,69.99) query = { "p1.Temperature": {"$gt": "10.00", "$lt": "16.00"}, "p1.Humidity": {"$gt": "20.00", "$lt": "69.99"} } # 直接统计符合条件的文档数量,比循环计数高效 counter = collection.count_documents(query) print(counter)
情况2:更稳妥的数值类型查询(避免字符串格式问题)
如果存在字符串格式不统一的情况(比如有的值是"10"而不是"10.00"),字符串比较会出错。这时可以用$toDouble将字符串转换为数值后再做比较(需要MongoDB 4.0及以上版本支持):
from pymongo import MongoClient # 连接数据库(替换成你的实际连接信息) client = MongoClient("mongodb://localhost:27017/") db = client.your_database_name collection = db.your_collection_name # 使用聚合管道实现类型转换+范围过滤+计数 pipeline = [ { "$match": { "$expr": { "$and": [ {"$gt": [{"$toDouble": "$p1.Temperature"}, 10.00]}, {"$lt": [{"$toDouble": "$p1.Temperature"}, 16.00]}, {"$gt": [{"$toDouble": "$p1.Humidity"}, 20.00]}, {"$lt": [{"$toDouble": "$p1.Humidity"}, 69.99]} ] } } }, {"$count": "total_matching_docs"} ] # 执行聚合并获取结果 result = list(collection.aggregate(pipeline)) counter = result[0]["total_matching_docs"] if result else 0 print(counter)
长期优化建议
把数据库中p1.Temperature和p1.Humidity字段的类型改成数值类型(比如double),这样不仅查询更高效,还能彻底避免字符串格式带来的各种问题。修改字段类型可以用以下聚合管道:
# 将字符串类型的温度、湿度转为double类型 collection.update_many( {}, [ { "$set": { "p1.Temperature": {"$toDouble": "$p1.Temperature"}, "p1.Humidity": {"$toDouble": "$p1.Humidity"} } } ] )
修改完成后,就可以直接用数值做范围查询了:
query = { "p1.Temperature": {"$gt": 10.00, "$lt": 16.00}, "p1.Humidity": {"$gt": 20.00, "$lt": 69.99} } counter = collection.count_documents(query) print(counter)
内容的提问来源于stack exchange,提问作者kavita k
相关产品推荐
相关产品推荐

