Mongodb 嵌套的mongo$add和$multiply生成can';t从BSON类型NULL转换为日期错误

Mongodb 嵌套的mongo$add和$multiply生成can';t从BSON类型NULL转换为日期错误,mongodb,aggregation-framework,Mongodb,Aggregation Framework,作为聚合项目阶段的一部分,我尝试向日期添加时区偏移量,以便根据修改后的日期进行分组 这些文档看起来像: { "_id": ObjectId("59ca593a9a94192d4f9d4452"), "updatedAt": new Date(1506433338535), "createdAt": new Date(1506433338535), "pubTimezone": "Europe/London", "text": "Buhzado fi apewem tuglik

作为聚合项目阶段的一部分,我尝试向日期添加时区偏移量,以便根据修改后的日期进行分组

这些文档看起来像:

{
  "_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转换为日期

我在数据中搜索了{pubTimezoneOffsetHours:null},并将所有具有null值的条目更新为具有整数值

当我从$multiply数组中删除“$pubTimezoneOffsetHours”时,错误消失


我哪里出错了?

我不确定您的$project/$push示例,因为这是一个语法错误,但专注于您的目标,您可能在
pubTimezoneOffsetHours
中的某个地方有一个空值(仍然),这使得调整后的日期为空,因为
$multiply
数组中的空值将强制整个事件为空值。试试这个尺码:

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

然后你可以
{$group:{{u id:$adjDate”}}
任何你喜欢的方式。

你能发布一个或两个通过管道的文档示例吗?我添加了一个示例文档是的,$push就在那里,因为我错误地从group阶段复制并粘贴了它。我已经用组和项目阶段更新了示例,因此有了更多的上下文。我在乘法数组中将“$pubTimezoneOffsetHours”替换为“{$ifNull:['$pubTimezoneOffsetHours',0]}”。错误已经消失了,这是巨大的。$ifNull位在不为null时是否仍返回“$pubTimezoneOffsetHours”,或者我也需要在数组中包含“$pubTimezoneOffsetHours”?@user3381520“是”。如果$pubTimezoneOffsetHours不为null,则$ifNull返回其值。不要把它放在数组中。不要羞于点击向上箭头。我现在看到,$ifNull返回“$pubTimezoneOffsetHours”,除非它为null,否则它返回0。很酷。谢谢@buzz moschetti,您已经回答了我的问题,非常感谢。对于将来阅读本文并希望在查询时使用时区日期运算符的任何人,可能已经准备好了。