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

时间:2019-04-02 04:52:40

标签: arrays mongodb aggregation-framework

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

文档看起来像这样。

{
  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,因此当我将它们添加为总计时,我得到的是正确的总计,没有错误。

任何帮助表示赞赏。

1 个答案:

答案 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'
      ]
    }
  }}
]