MERN栈中如何以对象为查询条件并使用$all运算符?
解决方案
你的问题出在对MongoDB $all 运算符的用法理解有误——$all 是用来匹配数组字段包含所有指定元素的,不能直接包裹整个查询对象。下面是正确的实现方式:
步骤1:构建正确的查询条件
需要针对theme字段单独处理,将其转换为$all匹配格式,其他字段保持精确匹配即可:
var request = { sdg: 'SDG 8: Decent Work & Economic Growth', theme: [ 'Economy', 'People' ] }; // 构建查询条件对象 const query = {}; for (const key in request) { if (key === 'theme') { // 对theme字段使用$all,确保文档的theme数组包含所有指定元素 query[key] = { $all: request[key] }; } else { // 其他字段(sdg、assignment_type)直接精确匹配 query[key] = request[key]; } }
步骤2:执行查询
把处理后的query传入find方法即可,当request为空时,query也会是空对象,此时会返回所有文档:
const test = await Project.find(query).sort({ createdAt: -1 }); console.log(test);
效果验证
- 当
theme传['Economy','People']时,数据库中theme为['Economy','People','Technology']的文档会被匹配到(因为包含所有指定元素) - 当用户选择所有类别为"Any"时,
request为空,query为空,find返回全部文档 - 其他字段(如
sdg、assignment_type)会按照精确匹配返回结果
内容的提问来源于stack exchange,提问作者Soccerball123
相关产品推荐
相关产品推荐

