如何基于MongoDB同集合内已有字段新增字段 可通过聚合实现吗?
问题解答
完全可以通过聚合操作实现该需求,根据你是否需要把新字段持久化写入原集合,有两种对应写法:
- 如果仅需要在查询结果中返回带
isGreen字段的内容,不修改原集合存储的数据,直接使用普通聚合查询即可,核心通过$addFields阶段搭配条件表达式计算新字段值:
// 替换为你实际的集合名称 db.fruits.aggregate([ { $addFields: { isGreen: { $cond: { if: { $eq: ["$colour", "green"] }, then: "yes", else: "no" } } } } ])
执行上述查询返回的结果结构就和你预期的完全一致,原集合的数据不会发生任何改动。
- 如果需要把
isGreen字段永久写入原集合的所有文档,使用MongoDB 4.2及以上版本支持的聚合管道更新语法即可,不需要额外写遍历逻辑,单条命令就能完成全集合字段新增和赋值:
// 替换为你实际的集合名称 db.fruits.updateMany( {}, // 空过滤条件,匹配集合内所有文档 [ { $set: { isGreen: { // $cond支持简写数组形式,顺序为[判断条件, 条件为真时的值, 条件为假时的值] $cond: [{ $eq: ["$colour", "green"] }, "yes", "no"] } } } ] )
注意:
updateMany的第二个参数传入数组时,MongoDB才会将其识别为聚合管道更新模式,支持用聚合表达式基于文档原有字段计算新值,非数组传参是普通更新模式,无法引用文档自身的字段做计算。
执行完上述更新命令后,再查询集合内的所有文档,就能看到isGreen字段已经被持久化写入,值完全符合预期:
{"_id" : "Apple", "colour" : "green", "isGreen" : "yes"} {"_id" : "Apple", "colour" : "red", "isGreen" : "no"}
如果你的MongoDB版本低于4.2,不支持聚合管道更新,才需要先查询所有文档,遍历每条文档判断colour字段值后再逐条更新,目前主流生产环境的MongoDB版本都支持上述聚合写法,不需要做冗余的遍历操作。
内容的提问来源于stack exchange,提问作者Dhar_
相关产品推荐
相关产品推荐

