You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyMongo多条件查询问题:$and/$exists与嵌套字段语法修正

解决PyMongo查询嵌套字段存在性的语法问题

我来帮你搞定这个查询的问题!你之前遇到的Key Error和语法错误,核心原因是嵌套字段的$exists条件写法不符合PyMongo(Python)的语法规范,还有查询条件的结构写错了。咱们一步步来纠正:

错误原因分析

  1. 第一个错误代码里,你在runTime的字典后面直接写['data']['PRICES SPOT': "$exists": true],这既不是合法的Python字典,也不是正确的MongoDB查询语法,直接导致Key Error。
  2. 更新后的代码依然混淆了列表和字典的写法,['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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:50:04