嵌套的mongo $ add和$ multiply导致无法从BSON类型NULL转换为Date错误

时间:2017-09-30 19:59:10

标签: mongodb aggregation-framework

作为聚合的项目阶段的一部分,我尝试将时区偏移添加到日期,以便我可以按修改日期分组。

文档看起来像:

{
  "_id": ObjectId("59ca593a9a94192d4f9d4452"),
  "updatedAt": new Date(1506433338535),
  "createdAt": new Date(1506433338535),
  "pubTimezone": "Europe/London",
  "text": "Buhzado fi apewem tuglikler mo lokwa pu luv aluar aghesgu li kelesipo bi.",
  "pubDate": new Date(1506433338052),
  "pubTimezoneOffsetHours": 0
}

相关代码:

[
  { 
    $project: {
      _id: '$_id',       
      text: '$text',
      pubTimezone: '$pubTimezone',
      pubTimezoneOffsetHours: '$pubTimezoneOffsetHours',
      pubDate: {
        $add: [ '$pubDate', {
          $multiply: [ '$pubTimezoneOffsetHours', 60, 60, 1000 ]
        }]
      }
    }
  },
  {
    $group: {
      _id: {
        year: { $year: '$pubDate' },
        month: { $month: '$pubDate' },
        day: { $dayOfMonth: '$pubDate' }
      },
      count: { $sum: 1 },
      items: {
        $push: {
          _id: '$_id',
          updatedAt: '$updatedAt',
          createdAt: '$createdAt',
          text: '$text',
          pubTimezone: '$pubTimezone',
          pubTimezoneOffsetHours: '$pubTimezoneOffsetHours',
          pubDate: {
            $subtract: [ '$pubDate', {
              $multiply: [ '$pubTimezoneOffsetHours', 60, 60, 1000 ]
          }]
        }
      }
    }
  }
]

这会导致错误:无法从BSON类型NULL转换为Date

我搜索了{pubTimezoneOffsetHours:null}的数据,并更新了所有具有空值的条目以获得整数值。

当我删除' $ pubTimezoneOffsetHours'从$ multiply数组中,错误消失。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

我不确定你的$ project / $ push示例,因为这是一个语法错误但是关注你的目标,你可能在pubTimezoneOffsetHours(仍然)的某个地方有一个null,并且调整后的日期为null因为$multiply数组中的null将强制整个事物为空。试试这个尺寸:

db.foo.aggregate([
  {$addFields: {adjDate: {$add: [
    "$pubDate",
    {$multiply: [ {$ifNull: ['$pubTimezoneOffsetHours',0]}, 60, 60, 1000 ]} 
    ] } 
}}
                ]);

然后你可以{$group: {_id:"$adjDate"}}以任何你喜欢的方式。