我有一个简单的文档,用于为用户存储对象数组,并且我希望获得这些数组的总和以及所有数组的总和。挑战在于某些文档缺少其他文档所具有的字段,这导致我的聚合查询失败。
文档看起来像这样。
{
name: '',
type: '',
cars: [],
boats: [],
planes: []
}
有些人没有船或飞机...而这些文件可能看起来像
{
name: '',
type: '',
cars: []
}
所以当我运行聚合时
[
{
'$match': {
'type': 'big_spender'
}
}, {
'$project': {
'name': '$name',
'cars': {
'$size': '$cars'
},
'boats': {
'$size': '$boats'
},
'planes': {
'$size': '$planes'
}
}
}, {
'$addFields': {
'total_vehicles': {
'$add': [
'$cars', '$boats', '$planes'
]
}
}
}
]
我收到错误消息:“ $ size的参数必须是一个数组,但类型为:丢失”
我很确定我可以使用$ exists来避免此问题,并返回0,但是我不知道该语法可能是什么样。
对于不存在的数组,我需要返回0,因此当我将它们添加为总计时,我得到的是正确的总计,没有错误。
任何帮助表示赞赏。
答案 0 :(得分:1)
使用$ifNull
聚合运算符。如果该字段不存在,它将用空白数组替换。
[
{ '$match': { 'type': 'big_spender' }},
{ '$project': {
'name': '$name',
'cars': { '$size': '$cars' },
'boats': { '$size': { '$ifNull': ['$boats', []] }},
'planes': { '$size': { '$ifNull': ['$planes', []] }}
}},
{ '$addFields': {
'total_vehicles': {
'$add': [
'$cars', '$boats', '$planes'
]
}
}}
]