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
相关产品推荐
相关产品推荐

