mongoDB 数组长度和缺失字段的总和

jpm*_*yob 2 arrays mongodb aggregation-framework

我有一个简单的文档,为用户存储对象数组,我希望获得这些数组的总和以及所有数组的总和;挑战在于某些文档缺少其他文档具有的字段,这导致我的聚合查询失败。

文档看起来像这样。

{
  name: '',
  type: '',
  cars: [],
  boats: [],
  planes: []
}
Run Code Online (Sandbox Code Playgroud)

有些人没有船或飞机......这些文件可能看起来像

{
  name: '',
  type: '',
  cars: []
}
Run Code Online (Sandbox Code Playgroud)

所以当我运行我的聚合时

[
  {
    '$match': {
      'type': 'big_spender'
    }
  }, {
    '$project': {
      'name': '$name', 
      'cars': {
        '$size': '$cars'
      }, 
      'boats': {
        '$size': '$boats'
      }, 
      'planes': {
        '$size': '$planes'
      }
    }
  }, {
    '$addFields': {
      'total_vehicles': {
        '$add': [
          '$cars', '$boats', '$planes'
        ]
      }
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

我收到错误:“$size 的参数必须是数组,但类型为:缺失”

我很确定我可以使用 $exists 来避免这个问题,并返回 0,但我不知道该语法可能是什么样子。

我需要为不存在的数组返回 0,因此当我将它们添加到总数中时,我会得到正确的总数并且没有错误。

任何帮助表示赞赏。

Ash*_*shh 5

使用$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'
      ]
    }
  }}
]
Run Code Online (Sandbox Code Playgroud)