MongoDB聚合$set阶段更新值何时在管道生效及同阶段字段赋值疑问
MongoDB聚合管道$set阶段的更新值生效时机及同阶段字段引用问题
核心结论
- $set阶段的更新值,仅在当前阶段执行完成后,才会作为下一个管道阶段的文档状态生效;同一个$set阶段内的所有字段赋值,都是基于进入该阶段时的原始文档快照计算,不会互相引用阶段内刚更新的字段值。
- 针对你给出的聚合操作:
同一段$set阶段内,字段B不会被设置为4。db.col.aggregate( [ { $set: { A: 4, B: "$A" } } ] )"$A"引用的是原始文档中A字段的原值,而非当前阶段刚设置的4。
详细解释
MongoDB聚合管道的每个阶段都遵循「快照处理」原则:
- 当文档进入某个阶段时,MongoDB会先创建该文档当前状态的快照;
- 阶段内的所有字段操作(比如$set的多个字段赋值),全部基于这个快照计算结果;
- 所有操作计算完成后,才会把更新后的文档传递到下一个管道阶段。
如果想让B引用更新后的A值,需要拆分两个独立的$set阶段:
db.col.aggregate([ { $set: { A: 4 } }, // 第一个阶段更新A为4,文档状态更新 { $set: { B: "$A" } } // 第二个阶段基于更新后的文档,将B设为4 ])
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

