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

PyMongo传入含JS函数的MongoDB查询报缺少右括号错误

问题原因
  • 核心语法错误:拼接目标匹配值58:FB:96:16:1D:F0时未给字符串加引号,最终传给MongoDB JS引擎的代码是deepIterate(this,58:FB:96:16:1D:F0),参数位置出现裸值加冒号的非法语法,直接触发missing ) in parenthetical的JS解析错误。
  • 写法隐患:采用零散字符串隐式拼接JS代码,极易遗漏空格、分隔符,比如代码中"if" "(typeof obj[field] === 'object')"这类写法完全依赖字符串拼接的巧合凑出合法语法,可维护性极差;同时私自把原Robo3T验证过的return true逻辑改成了return obj,存在隐性逻辑偏差风险。
修复方案

不要用零散字符串拼接JS代码,直接用Python三引号整段写入和Robo3T中逻辑一致的JS,同时给目标匹配值补上合法的字符串引号即可,修正后的代码如下:

db_query = {
    "$where": """
    function() {
        function deepIterate(obj, value) {
            for (field in obj) {
                if (obj[field] == value){
                    return true;
                }
                found = false;
                if (typeof obj[field] === 'object') {
                    found = deepIterate(obj[field], value)
                    if (found) { return true; }
                }
            }
            return false;
        };
        return deepIterate(this, "58:FB:96:16:1D:F0")
    }
    """
}

# 执行查询
for record in db.collection.find(db_query):
    print(record)

修复点说明

  • 用三引号整段包裹JS代码,完全对齐Robo3T中已验证可运行的逻辑,从根源避免字符串拼接漏字符、漏空格的问题。
  • 给目标匹配的MAC地址值补上双引号,作为合法JS字符串传入,解决核心解析报错。
  • 将误写的return obj还原为原逻辑的return true,消除逻辑偏差。

提示:$where查询需要逐文档执行JS解释逻辑,完全无法利用索引,性能很差,仅适合临时数据排查使用,生产环境建议通过嵌套路径精确查询、模型打平等方式替代。

内容的提问来源于stack exchange,提问作者roguepanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:57:30