如何将筛选数组转换为对象用于Mongoose的find方法?
Mongoose动态构建多条件筛选器的解决方案
你当前的筛选条件是一个包含多个独立条件对象的数组:
[ { name: { '$eq': 'John' } }, { surname: { '$regex': '.*t', '$options': 'i' } } ]
直接将数组传入this.customerModel.find(findFilters)会报错,因为find()要求参数是单一对象,而非多个对象组成的数组。
之前尝试的{ ...findFilters }会把数组索引转为对象键,得到带0、1键的无效结构;forEach的方式错误地将对象作为键,结果同样无法使用。
正确的解决方法
需要将数组中的所有条件对象合并为一个单一对象,Mongoose会默认将多个条件视为**逻辑与(AND)**关系执行查询。
方法1:使用Object.assign合并
const findFilters = [ { name: { '$eq': 'John' } }, { surname: { '$regex': '.*t', '$options': 'i' } } ]; // 将数组中的所有对象合并到空对象中 const mergedFilter = Object.assign({}, ...findFilters); // 传入find方法执行查询 this.customerModel.find(mergedFilter);
方法2:使用ES6展开运算符合并
const findFilters = [ { name: { '$eq': 'John' } }, { surname: { '$regex': '.*t', '$options': 'i' } } ]; // 展开数组中的每个对象到新对象里 const mergedFilter = { ...findFilters[0], ...findFilters[1] }; // 如果数组长度不确定,可直接展开整个数组: // const mergedFilter = { ...(...findFilters) }; this.customerModel.find(mergedFilter);
合并后得到的有效筛选对象为:
{ name: { '$eq': 'John' }, surname: { '$regex': '.*t', '$options': 'i' } }
该对象完全符合find()方法的参数要求,能正确执行多条件搜索。
内容的提问来源于stack exchange,提问作者g_m
相关产品推荐
相关产品推荐

