MongoDB查询求助:获取符合指定include/exclude条件的Employee文档
MongoDB查询修正:匹配数组内关联字段并排除特定元素
原查询的问题
- include数组匹配逻辑错误:原查询中
"history.include.type": "C"和"history.include.value": { $in: [1, 2, 3] }是分开匹配的,会命中数组中不同元素分别满足type和value的情况,而非同一个元素同时满足type=C/P且value在[1,2,3]的条件。 - exclude数组逻辑错误:原查询的写法无法正确排除存在
type=A/B且value在[2,4,6]的元素,反而会错误匹配不符合预期的文档。
修正后的查询语句
db.Employee.find({ $and: [ // 匹配include数组中存在至少一个元素同时满足type为C/P且value在[1,2,3] { "history.include": { $elemMatch: { type: { $in: ["C", "P"] }, value: { $in: [1, 2, 3] } } } }, // 排除exclude数组中存在任何一个元素满足type为A/B且value在[2,4,6]的文档 { "history.exclude": { $not: { $elemMatch: { type: { $in: ["A", "B"] }, value: { $in: [2, 4, 6] } } } } } ] })
逻辑解释
- include部分:使用
$elemMatch确保数组中存在同一个元素同时满足type为C或P,且value在指定范围内。 - exclude部分:通过
$not+$elemMatch组合,确保exclude数组中不存在任何一个元素满足type为A或B且value在[2,4,6]的条件,完全符合需求。
示例数据验证
你提供的示例数据中,history.include里没有type为C/P的元素,因此不会被该查询命中。如果将示例数据修改为:
Employee{ history:{ include:[ { type: "C", value: 2 }, { type: "B", value: 2 } ], exclude:[ { type: "C", value: 1 } ] } }
该文档会被正确返回:include数组存在符合条件的元素,exclude数组也不存在需要排除的元素。
内容的提问来源于stack exchange,提问作者Varun Yadav
相关产品推荐
相关产品推荐

