MongoDB中含Null列与非空列相加结果的技术确认问询
嘿,这个问题我刚好门儿清,来给你掰扯明白~
首先得明确:MongoDB里$add和$sum这俩操作符对null的处理逻辑完全不一样,这就是你看到两种不同结果的核心原因。
先看你用$project的测试结果
你执行的命令是:
db.EMP.aggregate([{$project:{ENAME:1 , total:{$add:["$SAL","$COMM"]}}}])
这里的关键是$add的规则:只要参与相加的任意一个值是null,整个$add的结果就会是null。比如某条数据里SAL是3500、COMM是null,那$add直接返回null,这就是你这个查询返回null的原因。
再看你用$group+$sum的测试结果
你执行的命令是:
db.EMP.aggregate({$group:{_id:"$ENAME",total:{$sum:{$add:["$SAL","$COMM"]}}}})
这里是两步操作的叠加:
- 先执行内层的
$add:只要有一个值是null,结果还是null - 然后外层的
$sum处理这些$add的结果:$sum的规则是忽略所有null和缺失值,如果一组数据里所有$add的结果都是null(没有任何有效值可以累加),那$sum就会默认返回0——这就是你看到结果为0的原因。
举个具体的例子,假设你的EMP集合里有两条数据:
{ "ENAME": "ALICE", "SAL": 5000, "COMM": null } { "ENAME": "BOB", "SAL": 4000, "COMM": 800 }
- 对ALICE来说,
$add得到null,$sum处理这个null时因为没有有效值,返回0 - 对BOB来说,
$add得到4800,$sum直接返回这个值
最终查询结果里ALICE的total是0,BOB的是4800,完全匹配你测试到的现象。
最后总结规则
- 单独用
$add:只要有null参与,结果必为null $sum包裹$add:$sum会跳过null,无有效值时返回0,有有效值则累加有效值
内容的提问来源于stack exchange,提问作者AHMED ALI
相关产品推荐
相关产品推荐

