无法从BSON类型字符串转换为日期

时间:2017-06-02 18:01:23

标签: javascript mongodb aggregation-framework

我的mongoDB中有以下示例的数据(集合:data_extraction_test):

{
    "_id" : ObjectId("4f16fc97d1e2d32371003e27"),
    "date" : "14 Nov 2000 08:22:00 -0800"
}

{
    "_id" : ObjectId("4f16fc97d1e2d32371003e28"),
    "date" : "14 Nov 2000 07:37:00 -0800"
}

{
    "_id" : ObjectId("4f16fc97d1e2d32371003e29"),
    "date" : "14 Nov 2000 07:25:00 -0800"
}

运行javascript代码(下面给出提取)时出现以下错误:无法从BSON类型字符串转换为日期

let cursor = col.aggregate([
                        {
                            $project:{
                                _id: "$_id",
                                year: {$year: new Date("13 Nov 2000 01:41:00 -0800 (PST)")},
                                // month: new Date(new String("$date")),
                                month: { $month: "$date" },
                            }
                        },
                        {
                            $out: "dan"
                        }
                    ]).toArray((err, items)=>{
                        assert.equal(null, err);
                        console.log("daniel",items);
                        resolve(true);
                        db.close();
                    });

如何将字符串转换为ISODate?

1 个答案:

答案 0 :(得分:0)

问题是您正在尝试将RFC日期格式转换为字符串对象。并且查询正在尝试转换假设它是Date对象。

我在您的数据库中记录了日期,将其替换为ISO 8601格式。

"14 Nov 2000 08:22:00 -0800" => ISODate("2000-11-14T16:22:00.000Z")

"14 Nov 2000 07:37:00 -0800" => ISODate("2000-11-14T15:37:00Z")

"14 Nov 2000 07:25:00 -0800" => ISODate("2000-11-14T15:25:00Z")

之后聚合查询起作用。

请注意,根据doc。 日期存储为64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数。

将日期存储为Date对象而不是以字符串开头可能更好。是否有理由将它们存储为字符串?

<强>更新 从用户Neil Lunn建议的链接开始。 您可以使用以下脚本将属性转换为ISO日期。

(请备份你的数据库。有些东西不对劲)

//change test to your collection name 
db.test.find({}).forEach(function (doc) {
    doc.date = new Date(doc.date);
    db.test.save(doc);
});