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
相关产品推荐
相关产品推荐

