MongoDB Aggregation Stages: addFiels (set) / project (unset) / replaceRoot (replaceWith)

Yao Yao on February 9, 2022

这一篇是吐槽。

$addFields 与它的 alias $set

$addFields,顾名思义,是添加 new field 用的,但同时它又能 overwrite existing fields,那你告诉我为什么一开始就不它命名成 $setField 之类的?

现在引入了 $set 做 alias,说是亡羊补牢吧,但是我现在又要区分 $set 是 operator 还是 stage。你从 SEO 的角度来看这么 aliasing 也不方便搜索吧?

$project 与它的 alias $unset

$project 的作用形象一点说是 “给 document 做瘦身”,它可以标定 included fields,也可以标定 excluded fields。估计是标定 excluded fields 用起来不太方便,所以引入了 $unset 做 alias。语法上,下面两种写法是等价的:

{ $project: { "<field1>": 0, "<field2>": 0, ... } }

{ $unset: [ "<field1>", "<field2>", ... ] }

但现在你这个 $unset$set 又不是一个层面上的语义,就很神经病。

$replaceRoot 与它的 alias $replaceWith

$replaceRoot 这个需要先理解啥是 “root”。这里 “root” 指的是 ROOT 这个专用于 aggregation 的 system variables

ROOT references the root document, i.e. the top-level document, currently being processed in the aggregation pipeline stage.

因为 aggregation 是个 pipeline,所以可以想象成是一个 chain,最原始的输入就是 root document。

$replaceRoot 的意图就是 “想要用 pipeline 下游得到的 aggregated document 替换掉 root document”,相当于是把 aggregate 和 replace 两步一起做了:

rootDocument <- aggregate(rootDocument)

目前看来,$replaceRoot 这个 stage name 设计得还行,但是它的完全体要写成这样:

{ $replaceRoot: { newRoot: <replacementDocument> } }

这个 newRoot 就不知所谓,引入的 alias $replaceWith 有更简单的语法:

{ $replaceWith: <replacementDocument> }


blog comments powered by Disqus