MongoDB+Node.js查询嵌套conditions字段完全匹配指定字典的实现方法
错误原因说明
你之前的查询无法生效主要有两个核心问题:
$where运算符要求传入可执行的JavaScript字符串/函数,你直接写collection.configuration.conditions==query属于语法错误,无法在MongoDB服务端执行- JavaScript中对象直接用
==比较是引用地址比较,而非深度值比较,即使两个对象结构完全一致也会返回false,这种写法本身逻辑不成立。
方案1:完全精确匹配(要求conditions结构、键顺序、键值对和查询对象完全一致,不能多任何额外字段)
如果你的查询要求是configuration.conditions和你给出的query对象100%完全一致,直接把query作为匹配条件传入即可:
const queryCondition = { 'cond1': { 'logic': 1, 'value': 555 }, 'cond2': { 'logic': 0, 'value': 55 }, 'cond3': { 'sub-cond1': 444, 'logic': 1, 'second-line': 'abc', 'sub-cond-2': 1231 }, 'cond4': { 'logic': -1, 'value': 1414 }, 'cond5': { 'logic': 0, 'value': 55 }, 'cond6': { 'logic': 1, 'value': 66 } }; // 执行查询,仅返回results字段 const cursor = collection.find( { "configuration.conditions": queryCondition }, { projection: { results: 1, _id: 0 } } ); // 获取结果集 const results = await cursor.toArray();
注意:该方案对嵌套对象的键顺序敏感,如果MongoDB中存储的conditions字段键顺序和你传入的query不一致,会导致匹配失败。
方案2:键值对全匹配(不要求键顺序、允许conditions有额外字段)
如果只要求query中所有的键值对都匹配,不限制conditions是否有其他额外字段、也不要求键顺序一致,可以通过点号指定全路径匹配每个字段:
const cursor = collection.find( { "configuration.conditions.cond1.logic": 1, "configuration.conditions.cond1.value": 555, "configuration.conditions.cond2.logic": 0, "configuration.conditions.cond2.value": 55, "configuration.conditions.cond3.sub-cond1": 444, "configuration.conditions.cond3.logic": 1, "configuration.conditions.cond3.second-line": "abc", "configuration.conditions.cond3.sub-cond-2": 1231, "configuration.conditions.cond4.logic": -1, "configuration.conditions.cond4.value": 1414, "configuration.conditions.cond5.logic": 0, "configuration.conditions.cond5.value": 55, "configuration.conditions.cond6.logic": 1, "configuration.conditions.cond6.value": 66 }, { projection: { results: 1, _id: 0 } } ); const results = await cursor.toArray();
如果query是动态生成的,你也可以写个递归函数自动把嵌套对象转换成带点号的查询条件,不需要手动拼接。
内容的提问来源于stack exchange,提问作者aya62
相关产品推荐
相关产品推荐

