作为聚合的项目阶段的一部分,我尝试将时区偏移添加到日期,以便我可以按修改日期分组。
文档看起来像:
{
"_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数组中,错误消失。
我哪里错了?
答案 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"}}
以任何你喜欢的方式。