0

我在使用 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
}
4

1 回答 1

3

简短的回答是您将字符串“created_at”传递给 Date 构造函数。如果将格式错误的日期字符串传递给构造函数,则会得到 ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ") 作为回报。

要正确创建新日期,您必须通过传入“created_at”的内容来执行此操作。不幸的是,我目前不知道使用聚合框架在字符串上运行日期构造函数的方法。如果您的集合足够小,您可以在客户端通过迭代您的集合并向每个文档添加一个新的日期字段来执行此操作。

于 2013-09-16T20:18:16.210 回答