MongoDB:无法将BSON类型EOO转换为日期

9

我正在尝试使用聚合框架(使用Ruby),并将日期投影为以下格式:

db['requests'].aggregate([
{"$project" => {
    _id: 0, 
    method: '$method', 
    user: '$user', 
    year: {'$year' => '$timestamp'}
}}])

这份文档就像这个样子:

{
_id: ObjectId("5177d7d7df26358289da7dfd"),
timestamp: ISODate("2013-04-12T03:58:05+00:00"),
method: "POST",
status: "200",
inputsize: "874",
outputsize: "4981",
user: "131"
}

但是我遇到了以下错误:
Mongo::OperationFailure: Database command 'aggregate' failed: (errmsg: 'exception: can't convert from BSON type EOO to Date'; code: '16006'; ok: '0.0').

这很奇怪,因为如果我在使用mongorestore导入的完全相同的数据库上运行它,它会正常工作。


显然,传递给aggregate()的数组的顺序很重要。如果您有一些字段省略了某些内容,您需要将其添加到$match中,并将$match作为数组中的第一个元素。例如:> db.user_account.aggregate([{$match:{"uts":{$exists:true},"chan_key":"333261c7a72650a95c68d30cd70"}},{$project:{"period_month":{$month:"$uts"}}},{$group:{_id:{"period_month":"$period_month"},"number":{$sum:1}}}]) - Wedge Martin
2个回答

20
问题在于我保存了一些没有时间戳字段的文档。

是的!我也是。我搜索了一下我的时间戳为“nil”的文档,只有一个文档。我修复了它,然后查询就可以工作了。 - Stephen Henderson
1
你能举个例子说明你是如何找到这些文档的吗? - jsbisht

2
如果您需要一些没有时间戳字段的文件,您可以尝试以下方法(我使用Javascript/Mongoose表示):
year: { $cond: [{ $ifNull: ['$timestamp', 0] }, { $year: '$deliveryDateEnd' }, -1] }

在这种情况下,所有没有时间戳字段的文档都将返回-1。所有其他文档将按预期返回年份。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接