如何从JSON文件将日期插入mongo

How to insert date into mongo from JSON file

本文关键字:日期 插入 mongo 文件 JSON      更新时间:2023-09-26

我有一个.json文件,其中包含一个带日期的对象。如何确保此日期字段在mongo中作为"日期"数据类型插入?

我需要通过node.js.来完成

{
    "name": "Jeff Johnson",
    "email": "jeff@gmail.com",
    "phone": "5555555555",
    "date_added": "2014-01-22T14:56:59.301Z"
}

这一点的核心基本上是,您正在使用的JSON不会"保留"数据类型",从而确定"日期",实际上它只是表示为"字符串"。当然,另一方面,MongoDB本身实际上是"无计划的",因此"数据库"没有固有的信息可以说这个字段应该是一个日期。

考虑到这一点,有几种方法从您的"当前"实施到"未来"考虑各不相同。

无论您是在解析数据(而且有很多解析器实现),那么就由"您的"应用程序逻辑"知道"这个字段实际上是一个"日期",然后自己处理转换。因此,归结到文档级别:

var obj = JSON.parse(singleJSONDoc);
obj.date_added = new Date(obj.date_added);

这将是您将为输入中的每个有效JSON文档实现的代码的基础,前提是输入可以一次读取一行。对于"流解析器",相同的方法各不相同,然后向您提供要修改的基本对象,甚至一些库可能支持"钩子",以允许您自定义解析的对象。

作为另一种方法,逻辑可以内置到应用程序自己的"模式"概念中。这就是大多数ODM实现的工作方式(一个例子是mongoose),您可以在其中定义模式和数据的"类型"。然后根据您的实现为您进行翻译。

例如:(猫鼬风格):

var personSchema = new Schema({
    "name": { "type": String },
    "email": { "type": String },
    "phone": { "type": String },
    "date_added": { "type": Date, "default": Date.now }
});
var Person = mongoose.model( "Person", personSchema );
var raw = JSON.parse(singleJSONDoc);
var person = new Person(raw);
person.save(function(err,doc) {
   // doc inserted here
})

因此,"逻辑"只是从代码中的一个位置移动到管理Schema和"类型"的"隔间"。转换是根据实现的"类型"为您完成的。例如,Mongoose可以开箱即用地执行Date。存在其他解决方案,但这是基本前提。

最后,另一种方法是JSON表示本身。MongoDB不久前引入了一个称为"扩展json语法"的概念,这在EJSON项目中显然是"借鉴"来的。

这里的总体思想是"启用"JSON解析器,无论是序列化还是反序列化,都可以为您处理"类型"转换。因此,基本上,虽然JavaScript(和其他语言)有"类型"的概念,但JSON本身只是一种"字符串"格式。因此,这里有一些特殊的处理,以"序列化"形式"保留"该类型信息,这样它就可以在保留"类型"的情况下"反序列化"回来。

格式如下:

{
    "name": "Jeff Johnson",
    "email": "jeff@gmail.com",
    "phone": "5555555555",
    "date_added": { "$date": "2014-01-22T14:56:59.301Z" }
}

这通常由实现EJSON规范的解析器、mongoimportmongoexport等其他工具以及一些本地驱动程序实现(Java、C#等)支持。

如果您可以将输入数据处理成这种格式,那么您只需使用解析器,不需要其他任何东西来处理转换。这里的好处是,您可以使用相同的解析器来"导出"信息,因此这在将JSON数据传递给客户端时非常有用,现在"客户端"也可以"感知"并正确处理类型转换。

所以简单的答案是,如果你不做一些工作,什么都做不了。MongoDB不包含模式,这取决于您的应用程序。智能"类型"转换不是基本JSON的一部分。使用其他库和代码来处理转换。

下面是一个例子。

{ "$date": "2018-11-10T22:26:12.111Z" }

这样

{
  "createdAt": { "$date": "2018-11-10T22:26:12.111Z" }
}

您应该使用对象数据建模库,如mongoose.js,为您的数据提供严格的建模环境。示例:

var pet = new Schema({
        animal: {
            type    : String,
            enum    :  ['cat', 'dog', 'snake', 'hamster'],
            require : true
        },
        age: {
            type    : Number,
            enum    : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
            require : true
        },
        color: {
            type: String
        },
        modified: {
            type    : Date,
            default : Date.now
        }
});

在将数据插入数据库之前,通过相应地转换dataTypes来准备数据。

1:将JSON解析为对象2:相应地更改值2.1:对于日期,您可以简单地执行:

some_object["date_added"] = new Date(some_object["date_added"]);

对于数字(整数),最好也这样存储;)