MongoDB多条件统计深层嵌套数组_a[]._p[]元素数量
MongoDB多层嵌套数组符合条件的_p元素统计方案
需要统计MongoDB中满足以下任一条件的所有_a[]._p[]元素数量:
- 条件1:
_a[]._p[].s.d.t[].dateP以2022开头,且_a[]._p[].s.d.t[].tF="N" - 条件2:
_a[]._p[].s.c.t[].dateP以2022开头,且_a[]._p[].s.c.t[].tF="N"
示例文档
{ "_id": ObjectId("5c05984246a0201286d4b57a"), "f": "x", "_a": [ { "_p": [ { "pid": 2, "s": { "d": { "t": [ { "id": 1, "dateP": "20200-09-20" }, { "id": 2, "dateP": "2022-09-20", "tF": "N" } ] }, "c": { "t": [ { "id": 3, "dateP": "20300-09-22" }, { "id": 4, "dateP": "2022-09-23", "tF": "N" } ] } } } ] } ] }
当前尝试的问题
使用db.collection.count({ "_a._p.s.c.t":{ $elemMatch:{ tF:"N" , dateP: /^2022/i } } })只能统计包含匹配条件的文档数量,无法精准统计嵌套数组中符合条件的_p元素个数,也无法同时覆盖两个条件的匹配。
正确的聚合查询方案
要实现精准统计,需要通过聚合框架逐层展开嵌套数组,再筛选计数:
db.collection.aggregate([ // 展开_a数组,将每个_a元素转为独立文档 { $unwind: "$_a" }, // 展开_a下的_p数组,将每个_p元素转为独立文档 { $unwind: "$_a._p" }, // 筛选满足任一条件的_p元素 { $match: { $or: [ { "_a._p.s.d.t": { $elemMatch: { dateP: /^2022/, tF: "N" } } }, { "_a._p.s.c.t": { $elemMatch: { dateP: /^2022/, tF: "N" } } } ] } }, // 统计符合条件的_p元素总数 { $group: { _id: null, total: { $sum: 1 } } }, // 调整输出格式,隐藏_id字段 { $project: { _id: 0, total: 1 } } ])
查询说明
$unwind阶段:逐层展开_a和_p嵌套数组,将原本的嵌套结构拆分为单条文档,确保每个_p元素都能被单独处理。$match阶段:通过$or组合两个条件,筛选出满足任一条件的_p元素对应的文档。$group阶段:按null分组,对筛选后的文档进行计数,得到符合条件的_p元素总数。$project阶段:调整输出格式,只保留total字段,符合期望的输出样式。
执行结果
针对示例文档执行上述聚合查询后,会得到如下结果:
{ "total" : 1 }
示例中的_p元素同时满足两个条件,但统计的是_p元素的数量,因此结果为1。
内容的提问来源于stack exchange,提问作者R2D2
相关产品推荐
相关产品推荐

