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

MongoDB:识别a.d[]中与a.p[]pid匹配但prid不同的嵌套记录

MongoDB 查询:识别并提取嵌套数组中"损坏"的记录

需求说明

需要从MongoDB文档的嵌套数组 a.d[] 中筛选出符合以下条件的记录:

  • 该记录的 pid 与同文档中 a.p[] 数组内某条记录的 pid 完全匹配
  • 两者的 prid 取值不同

示例文档

{ 
  "f": 1, 
  "a": [ 
    { 
      "aid":1, 
      "p": [ { "prid": "1", "pid": { "c": "A", "s": "B", "k": "C" }, "X": 20 } ], 
      "d": [ 
        { "prid": "1", "pid": { "c": "A", "s": "B", "k": "C" } }, 
        { "prid": "2", "pid": { "c": "A", "s": "B", "k": "C" } } 
      ] 
    } 
  ] 
}

预期输出

{ "f":1 , "aid": 1 , "prid": 2 }

查询解决方案

使用MongoDB聚合管道实现需求,步骤包括展开嵌套数组、匹配条件、投影目标字段:

db.collection.aggregate([
  // 展开外层a数组
  { $unwind: "$a" },
  // 展开a.p数组
  { $unwind: "$a.p" },
  // 展开a.d数组
  { $unwind: "$a.d" },
  // 匹配pid相同但prid不同的记录
  {
    $match: {
      $expr: {
        $and: [
          { $eq: ["$a.d.pid", "$a.p.pid"] },
          { $ne: ["$a.d.prid", "$a.p.prid"] }
        ]
      }
    }
  },
  // 投影需要的字段并剔除_id
  {
    $project: {
      _id: 0,
      f: "$f",
      aid: "$a.aid",
      prid: "$a.d.prid"
    }
  }
])

后续删除操作参考

若要移除这些"损坏"的嵌套对象,可结合$filter和$map的更新管道实现:

db.collection.updateMany(
  {},
  [
    {
      $set: {
        "a": {
          $map: {
            input: "$a",
            as: "aItem",
            in: {
              $mergeObjects: [
                "$$aItem",
                {
                  d: {
                    $filter: {
                      input: "$$aItem.d",
                      as: "dItem",
                      cond: {
                        $not: {
                          $anyElementTrue: {
                            $map: {
                              input: "$$aItem.p",
                              as: "pItem",
                              in: {
                                $and: [
                                  { $eq: ["$$dItem.pid", "$$pItem.pid"] },
                                  { $ne: ["$$dItem.prid", "$$pItem.prid"] }
                                ]
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  ]
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:15:16