我有一个下面结构的文档,我希望在过去的2个月里总共得到2013.5和2013.4,作为获得前10个软件包的过程的一部分。
如果我使用聚合
db.hits.aggregate(
{$project:{"total":{"$add":["$value.2013.5", "$value.2013.4"]}}})
仅当文档中存在两个字段时,才会返回总数值。如果缺少任何字段,则total的值为null。我有什么想法可以解决这个问题。从$ project开始有$ group,$ sort,$ limit,但为了清楚起见,我省略了它们。
{
"_id" : "4e6eef33-d88a-4d4d-a6b2-6becf1be7e8f",
"value" : {
"package" : 4498
"2012" : {
"1" : 1.0,
"2" : 1.0,
"4" : 1.0,
"6" : 4.0,
"7" : 2.0,
"8" : 5.0,
"12" : 1.0,
"hits" : 15.0
},
"2013" : {
"1" : 6.0,
"4" : 2.0,
"hits" : 8.0
},
"hits" : 23.0
}
}
顺便说一下,我用两个月只是为了说明。我通常会用12个月。
编辑: 我的后备是编写一个函数,在文档中添加缺少的字段。我很感兴趣,如果有办法,我可以避免这样做。
答案 0 :(得分:4)
只有当两个字段都存在于文档中时,才会返回总数值。
如果其中一个字段不存在,则将其视为undefined
。 undefined
值在任何操作中传播。
如果我使用聚合[...]
您可以使用$ifNull运算符:
db.hits.aggregate({$project:{"total":{"$add":[{$ifNull: ["$value.2013.5", 0]}, {$ifNull: ["$value.2013.4", 0]}]}}})