MongoDB更新管道中用$filter排除子文档指定键的技术问询
MongoDB更新管道排除子文档指定键的解决方案
你可以通过$not运算符结合$in来实现排除指定键的需求,因为聚合管道的$filter条件中支持布尔表达式,而$nin属于查询操作符,不能直接在聚合表达式里使用。
下面是完整的更新管道代码:
[ { $set: { things: { $arrayToObject: { $filter: { input: { $objectToArray: "$$ROOT.things" }, as: "item", cond: { $not: { $in: ["$$item.k", discardKeys] } } } } } } } ]
逻辑说明:
$objectToArray: "$$ROOT.things":把things对象转换成键值对数组,格式为[{k: "a1", v: {}}, ..., {k: "x1", v: {}}]。$filter:遍历数组,只保留满足条件的元素。$not: { $in: ["$$item.k", discardKeys] }:判断当前元素的键不在discardKeys列表中,符合条件的元素会被保留。$arrayToObject:把过滤后的键值对数组重新转换回对象格式,赋值给things字段。
这个方法和你之前用keepKeys的思路逻辑一致,只是把“保留在列表中”改成了“不在排除列表中”,完全适配你需要排除少量键的场景。
内容的提问来源于stack exchange,提问作者iss42
相关产品推荐
相关产品推荐

