PyMongo多条件查询问题:$and/$exists与嵌套字段语法修正
解决PyMongo查询嵌套字段存在性的语法问题
我来帮你搞定这个查询的问题!你之前遇到的Key Error和语法错误,核心原因是嵌套字段的$exists条件写法不符合PyMongo(Python)的语法规范,还有查询条件的结构写错了。咱们一步步来纠正:
错误原因分析
- 第一个错误代码里,你在
runTime的字典后面直接写['data']['PRICES SPOT': "$exists": true],这既不是合法的Python字典,也不是正确的MongoDB查询语法,直接导致Key Error。 - 更新后的代码依然混淆了列表和字典的写法,
['data']['PRICES SPOT': "$exists": true]这种写法完全不符合Python语法规则,所以触发语法错误。
正确的查询写法
针对你的三个查询条件,我们可以用两种合法的方式构建查询:
方式1:使用点符号表示嵌套字段(更简洁)
在MongoDB查询中,嵌套字段可以用点分隔符直接表示,比如"data.PRICES SPOT",这样不需要嵌套字典,写法更清爽:
def grab_forecast_cursor(self, model_dt_from, model_dt_till): # 正确构建查询条件 query = { "Type": "f", "runTime": {"$gte": model_dt_from, "$lte": model_dt_till}, "data.PRICES SPOT": {"$exists": True} } # 注意:PyMongo中$exists的值用Python的True(大写T),不是MongoDB shell的true cursor = self._collection.find(query) return cursor
方式2:使用嵌套字典表示(更直观展示层级)
如果你更倾向于清晰展示字段的嵌套结构,也可以用嵌套字典来写:
def grab_forecast_cursor(self, model_dt_from, model_dt_till): query = { "Type": "f", "runTime": {"$gte": model_dt_from, "$lte": model_dt_till}, "data": { "PRICES SPOT": {"$exists": True} } } cursor = self._collection.find(query) return cursor
为什么不需要显式用$and?
MongoDB默认会对多个查询条件执行逻辑与操作,所以你不需要手动包裹$and数组,除非你需要和其他逻辑操作符(比如$or)结合使用。当然,如果你想显式写$and,也是完全可以的,写法如下:
query = { "$and": [ {"Type": "f"}, {"runTime": {"$gte": model_dt_from, "$lte": model_dt_till}}, {"data.PRICES SPOT": {"$exists": True}} ] }
验证说明
你的示例文档完全符合这三个条件:
- Type字段为"f"
- runTime在指定时间范围内
- data下存在"PRICES SPOT"字段
所以用上面的代码可以正确匹配到该文档,不会再出现之前的错误。
内容的提问来源于stack exchange,提问作者nrvaller
相关产品推荐
相关产品推荐

