MongoDB聚合如何使用$elementMatch或$unwind匹配数组多AND条件
MongoDB数组多组独立条件AND查询实现方案
需求说明
需要查询同时满足以下两个条件的文档:
user_response数组中存在至少一个元素满足:question_numeric_id: 1且question_answer: "Male"user_response数组中存在至少一个元素满足:question_numeric_id: 2且question_answer: "GJ"
预期返回_id = 1和_id = 3的文档。
常见误区说明
之前用$elemMatch未生效大概率是将多组条件放在了同一个$elemMatch配置内,该写法要求同一个数组元素同时满足所有条件,不符合多组独立条件匹配不同数组元素的需求。
聚合框架实现方案
方案1:$match 配合多组 $elemMatch 组合(最简实现)
直接在聚合的$match阶段使用$and拼接多个独立的$elemMatch规则,每个$elemMatch对应一组需要满足的数组元素条件:
db.collection.aggregate([ { $match: { $and: [ { user_response: { $elemMatch: { question_numeric_id: 1, question_answer: "Male" } } }, { user_response: { $elemMatch: { question_numeric_id: 2, question_answer: "GJ" } } } ] } } ])
该方案性能最优,可命中user_response.question_numeric_id和user_response.question_answer的联合索引。
方案2:$expr + 数组逻辑判断(灵活扩展多条件场景)
如果需要匹配的规则组数不固定,可使用$allElementsTrue结合$map做动态判断,更适合规则动态生成的场景:
db.collection.aggregate([ { $match: { $expr: { $allElementsTrue: { $map: { input: [ { qid: 1, ans: "Male" }, { qid: 2, ans: "GJ" } // 可直接在input数组中扩展更多需要匹配的条件组 ], as: "condition", in: { $gt: [ { $size: { $filter: { input: "$user_response", as: "resp", cond: { $and: [ { $eq: ["$$resp.question_numeric_id", "$$condition.qid"] }, { $eq: ["$$resp.question_answer", "$$condition.ans"] } ] } } } }, 0 ] } } } } } } ])
该方案无需修改聚合结构,只需修改input数组中的规则即可扩展更多匹配条件。
内容的提问来源于stack exchange,提问作者Hemant
相关产品推荐
相关产品推荐

