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

Posted

技术标签:

【中文标题】无法从 BSON 类型字符串转换为日期【英文标题】:Can't convert from BSON type string to Date 【发布时间】:2017-11-04 05:14:39 【问题描述】:

我的 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 代码时(摘录如下)出现以下错误:Can't convert from BSON type string to Date

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?

【问题讨论】:

嗨,这是您数据库中文档的实际表示形式吗?你是如何将这些日期插入数据库的? 您好,这是此集合中文档的实际表示。我之前执行过这个函数: db.messages.aggregate([$project : date: $substr : ["$headers.Date", 5, 26],$out: "date_extraction_test" ]) 查看Converting string to date in mongodb了解如何修复数据的详细信息 【参考方案1】:

问题是您正在尝试将 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);
);

【讨论】:

感谢您的回答。你是如何用 ISO 8601 格式替换它们的?您是否手动编辑了所有这些?我有很多数据,无法手动编辑...日期在我的 mongoDB 中存储为字符串,因为原始数据集中的日期格式为字符串。 非常感谢,很有帮助。

以上是关于无法从 BSON 类型字符串转换为日期的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:无法从缺少的 BSON 类型转换为日期

MongoError:在对嵌套文档中的记录进行分组时,无法从缺少的 BSON 类型转换为日期

MongoDB:无法从 BSON 类型 EOO 转换为 Date

MongoDb:无法优化管道:原因:无法从 BSON 类型 javascript 转换为 Date

在 Java 中将 org.bson.Document 转换为 org.bson.BasicBSONObject?

MongoDB:BSON 到 JSON