MongoDB聚合中使用$ifNull后如何直接获取内部属性值?
解决MongoDB聚合中直接提取字段值的问题
你的问题核心是错误地在foo字段下嵌套了current键,导致聚合结果出现不必要的层级。我们只需要调整聚合阶段的结构,让foo字段直接接收$ifNull的计算结果即可。
正确的聚合阶段写法
把原来嵌套的current键去掉,直接将$ifNull的结果赋值给foo:
{ "foo": { $ifNull: ["$current.foo", "$new.foo"] } }
为什么原来的写法不对?
你之前的语句:
{ "foo": { "current": { $ifNull: ["$current.foo", "$new.foo"] } } }
本质是给foo字段定义了一个包含current子键的对象,所以结果自然会是{ "foo": { "current": "bar" } }这种嵌套结构。而我们需要的是foo字段直接等于$ifNull返回的字符串值,所以去掉外层的current键就可以了。
执行结果验证
对你的两个文档执行正确的聚合阶段后,会得到你期望的结果:
- 第一个文档输出:
{"foo": "bar"} - 第二个文档输出:
{"foo": "baz"}
补充说明
$ifNull的逻辑是:如果第一个表达式($current.foo)不为null或不存在,就返回它的值;否则返回第二个表达式($new.foo)的值,完全符合你聚合foo字段的需求。
内容的提问来源于stack exchange,提问作者kraik
相关产品推荐
相关产品推荐

