MongoDB嵌套对象多条件查询:筛选符合类ID与数量要求的分组
MongoDB 分组筛选解决方案
需求说明
需要筛选满足以下两个条件的分组:
- 分组必须包含id为
101、102、103的classes条目 - id为
101和102的classes的quantity数值小于100(注意示例中quantity为字符串类型,需转换为数值比较)
查询语句
db.collection.find({ $expr: { $and: [ // 验证分组包含所有目标id的classes { $allElementsTrue: [ { $map: { input: ["101", "102", "103"], as: "targetId", in: { $in: ["$$targetId", "$classes.id"] } }} ]}, // 验证id=101的quantity < 100 { $lt: [ { $toInt: { $arrayElemAt: ["$classes.quantity", { $indexOfArray: ["$classes.id", "101"] }] } }, 100 ]}, // 验证id=102的quantity < 100 { $lt: [ { $toInt: { $arrayElemAt: ["$classes.quantity", { $indexOfArray: ["$classes.id", "102"] }] } }, 100 ]} ] } })
语句解释
- 条件1处理:通过
$map遍历目标id数组,逐个检查每个id是否存在于当前分组的classes.id集合中,再用$allElementsTrue确保所有目标id都存在。 - 条件2和3处理:先用
$indexOfArray定位目标id在classes数组中的位置,再用$arrayElemAt取出对应的quantity值,通过$toInt将字符串转换为数值后,与100做小于比较。
示例数据结果分析
对提供的3个分组逐一验证:
- group1:id=101的
quantity为"100",转换后等于100,不满足小于100的要求,被排除。 - group2:缺少id=103的classes条目,不满足条件1,被排除。
- group3:id=102的
quantity为"240",转换后大于100,不满足要求,被排除。
最终没有符合所有条件的分组。
内容的提问来源于stack exchange,提问作者Alper
相关产品推荐
相关产品推荐

