我遇到了MongoDB shell版本的一个非常奇怪的问题:2.4.6。它与从字符串创建ISODate对象有关。请参阅下面的具体示例。
为什么这不起作用。
collection.aggregate({$project: {created_at: 1, ts: {$add: new Date('created_at')}}}, {$limit: 1})
{
"result" : [
{
"_id" : ObjectId("522ff3b075e90018b2e2dfc4"),
"created_at" : "Wed Sep 11 04:38:08 +0000 2013",
"ts" : ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
}
],
"ok" : 1
}
但是这样做。
collection.aggregate({$project: {created_at: 1, ts: {$add: new Date('Wed Sep 11 04:38:08 +0000 2013')}}}, {$limit: 1})
{
"result" : [
{
"_id" : ObjectId("522ff3b075e90018b2e2dfc4"),
"created_at" : "Wed Sep 11 04:38:08 +0000 2013",
"ts" : ISODate("2013-09-11T04:38:08Z")
}
],
"ok" : 1
}
答案 0 :(得分:3)
简短的回答是你将字符串'created_at'传递给Date构造函数。如果您将格式错误的日期字符串传递给构造函数,则会获得ISODate(“0NaN-NaN-NaNTNaN:NaN:NaNZ”)作为回报。
要通过传递'created_at'的内容来正确创建新日期,您必须这样做。不幸的是,我不知道在这个时候使用聚合框架在字符串上运行日期构造函数的方法。如果您的集合足够小,您可以通过迭代您的集合并为每个文档添加新的日期字段来在客户端中执行此操作。