MongoDB如何基于动态数组动态构造嵌套字段查询条件
实现方案
你可以用数组的map方法结合ES6计算属性名语法,动态生成$or对应的查询条件,不需要硬编码字段,代码如下:
const dynamicArray = ['sample1', 'sample2']; // 动态构造$or条件数组 const orConditions = dynamicArray.map(item => ({ [`myField.${item}`]: true })); // 组装完整查询语句 const query = { visibility: true, $or: orConditions }; const recipes = await Recipe.find(query).countDocuments();
边界情况处理
如果dynamicArray存在为空的可能,需要额外加判断避免MongoDB报$or needs an array的错误,示例如下:
let recipes = 0; // 仅在数组有值时执行查询 if (dynamicArray.length) { const orConditions = dynamicArray.map(item => ({ [`myField.${item}`]: true })); const query = { visibility: true, $or: orConditions }; recipes = await Recipe.find(query).countDocuments(); } // 空数组场景可根据业务需求调整返回逻辑,比如返回全部可见内容等
原理解释
核心用到了ES6的计算属性名特性,你可以在对象字面量的键位置用方括号包裹表达式,动态计算最终的键名,这样就能根据数组里的不同值,自动拼接出myField.sample1、myField.sample2这类动态字段名。
内容的提问来源于stack exchange,提问作者mykoman
相关产品推荐
相关产品推荐

