MongoDB如何筛选含指定数组元素且嵌套子数组长度符合条件的文档

解答
这个需求完全可以直接在MongoDB侧实现,不需要查询结果返回后再在服务层写代码二次过滤,直接用原生数组查询操作符就能完成匹配,性能比服务层处理高很多。
匹配的核心逻辑是找到categories数组中同时满足以下两个要求的文档:
- 数组内存在对应
CONSULTANT_AGREEMENT分类的元素 - 该分类元素下的
subCategories数组长度恰好为1
根据categories数组的常见存储结构,对应两种查询写法:
- 如果你的
categories数组元素是把分类名作为键存储的结构(例:categories: [{ CONSULTANT_AGREEMENT: { subCategories: ["xxx"] } }, { OTHER_CATEGORY: { ... } }]),直接用$elemMatch搭配$size操作符查询即可:
// 替换成你自己的集合名 db.documents.find({ categories: { $elemMatch: { "CONSULTANT_AGREEMENT.subCategories": { $size: 1 } } } })
- 如果你的
categories数组元素是用固定字段存储分类标识的结构(例:categories: [{ type: "CONSULTANT_AGREEMENT", subCategories: ["xxx"] }, { type: "OTHER_CATEGORY", ... }]),查询写法如下:
// 替换成你自己的集合名 db.documents.find({ categories: { $elemMatch: { type: "CONSULTANT_AGREEMENT", subCategories: { $size: 1 } } } })
补充说明:
$size是MongoDB原生提供的数组精确长度匹配操作符,如果给categories字段创建了数组索引,这个查询可以直接走索引命中,效率很高。只有当你需要对数组内元素做复杂聚合计算(比如统计subCategories中符合特定条件的元素数量再做判断)时才需要用到聚合管道,你当前的需求用普通查询语句就可以完全覆盖。
内容的提问来源于stack exchange,提问作者Gowtham Munukutla
相关产品推荐
相关产品推荐

