繁体   English   中英

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

[英]How to insert date into mongo from JSON file

我有一个.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
})

因此,“逻辑”只是从代码中的一个位置移动到管理架构和“类型”的“隔间”。 转换是根据实现的“类型”为您完成的。 猫鼬确实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
        }
});

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

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

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

对于数字(整数),最好也将它们存储为 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM