MongoDB聚合操作中如何依据关联关系移除对应动态字段
实现思路
你的两个数组A_set和A_count_set是按索引位置一一关联的,所以可以先将两个数组按索引配对,过滤掉符合删除条件的配对项后,再拆分回两个独立数组即可,无需分两次操作。
完整聚合语句
你可以把原来的单$set过滤阶段替换为如下的聚合阶段,一步完成两个数组的同步过滤:
{ $set: { // 先将两个数组按索引配对 paired_arr: { $filter: { input: { $zip: { inputs: ["$A_set", "$A_count_set"] } }, as: "pair", // 过滤条件:配对项的第一个元素不是 {"A":"N"} cond: { $ne: [ { $first: "$$pair" }, { A: "N" } ] } } } } }, // 拆分配对后的数组恢复原始字段结构 { $set: { A_set: { $map: { input: "$paired_arr", as: "pair", in: { $first: "$$pair" } } }, A_count_set: { $map: { input: "$paired_arr", as: "pair", in: { $last: "$$pair" } } }, // 删除临时配对字段 paired_arr: "$$REMOVE" } }
版本兼容说明
如果你使用的MongoDB版本低于5.2(不支持$first/$last操作数组元素),可以用$arrayElemAt替代:
- 取配对项第一个元素:
$arrayElemAt: ["$$pair", 0] - 取配对项第二个元素:
$arrayElemAt: ["$$pair", 1]
如果存在两个数组长度不一致的场景,可以给$zip添加useLongestLength: true参数,再补充对应空值的过滤逻辑即可。
内容的提问来源于stack exchange,提问作者femtowatts
相关产品推荐
相关产品推荐

