Javascript Can';t从BSON类型字符串转换为日期

Javascript Can';t从BSON类型字符串转换为日期,javascript,mongodb,aggregation-framework,Javascript,Mongodb,Aggregation Framework,在我的mongoDB中有如下示例所示的数据(收集:数据提取测试): 运行javascript代码(下面给出了摘录)时,会出现以下错误:无法将BSON类型字符串转换为日期 let cursor = col.aggregate([ { $project:{ _id: "$_id",

在我的mongoDB中有如下示例所示的数据(收集:数据提取测试):

运行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?

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

我在你的数据库中记录了日期,用ISO8601格式替换了它们

"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")
在此之后,聚合查询开始工作

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

最好将日期存储为日期对象,而不是以字符串开头。是否有理由将它们存储为字符串

更新 根据用户Neil Lunn建议的链接。 您可以使用以下脚本将属性转换为ISO日期

(请备份数据库,以防出现问题)


您好,这是您数据库中文档的实际表示形式吗?您是如何将这些日期插入数据库的?您好,这是此集合中文档的实际表示形式。我以前执行过这个函数:db.messages.aggregate([{$project:{$date:{$substr:[“$headers.date”,5,26]}}},{$out:“date\u extraction\u test”}])请参阅以获取修复数据的详细信息感谢您的回答。您是如何用ISO 8601格式替换它们的?您是否手动编辑了所有这些内容?我有很多数据,不能全部手工编辑。。。日期在我的mongoDB中存储为字符串,因为原始数据集中的日期格式为字符串。非常感谢,这很有帮助。
"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")
//change test to your collection name 
db.test.find({}).forEach(function (doc) {
    doc.date = new Date(doc.date);
    db.test.save(doc);
});