You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB多层嵌套数组:如何提取符合指定条件的关联字段

MongoDB多层嵌套数组提取目标字段解决方案

需求说明

从多层嵌套数组文档中,仅筛选_a._p._pubId.CC = "EN"的条目,提取其对应的_prid以及s下c和d中所有text.secId,输出格式为包含_prid和secId的对象列表。

示例文档

[
  {
    _id: 1,
    "_a": [
      {
        "_p": [
          {
            _pubId: { "CC": "EN" },
            _prid: "2",
            s: {
              c: { text: [{ secId: "4" }, { secId: "5" }] },
              d: { text: [{ secId: "6" }, { secId: "7" }] }
            }
          },
          {
            _pubId: { "CC": "CZ" },
            _prid: "4",
            s: { c: { text: [{ secId: "8" }, { secId: "9" }] } }
          }
        ]
      },
      {
        "_p": [
          {
            _pubId: { "CC": "CZ" },
            _prid: "200",
            s: {
              c: { text: [{ secId: "4" }, { secId: "5" }] },
              d: { text: [{ secId: "6" }, { secId: "7" }] }
            }
          },
          {
            _pubId: { "CC": "BG" },
            _prid: "4",
            s: { c: { text: [{ secId: "8" }, { secId: "9" }] } }
          }
        ]
      }
    ]
  }
]

聚合查询代码

db.collection.aggregate([
  // 展开外层_a数组
  { $unwind: "$_a" },
  // 展开_a下的_p数组
  { $unwind: "$_a._p" },
  // 过滤出pubId.CC为EN的条目
  { $match: { "_a._p._pubId.CC": "EN" } },
  // 将s下的c.text和d.text合并为一个数组,同时保留prid
  {
    $project: {
      _id: 0,
      _prid: "$_a._p._prid",
      secIds: {
        $concatArrays: [
          "$_a._p.s.c.text",
          { $ifNull: ["$_a._p.s.d.text", []] } // 兼容d字段不存在的场景
        ]
      }
    }
  },
  // 展开合并后的secIds数组
  { $unwind: "$secIds" },
  // 整理成目标输出格式
  {
    $project: {
      _prid: 1,
      secId: "$secIds.secId"
    }
  }
])

查询结果

{ "_prid" : "2", "secId" : "4" }
{ "_prid" : "2", "secId" : "5" }
{ "_prid" : "2", "secId" : "6" }
{ "_prid" : "2", "secId" : "7" }

内容的提问来源于stack exchange,提问作者R2D2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:17:43