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

Cat*_*ish 7 javascript mongodb node.js mongodb-query

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

我需要通过node.js完成此操作.

{
    "name": "Jeff Johnson",
    "email": "jeff@gmail.com",
    "phone": "5555555555",
    "date_added": "2014-01-22T14:56:59.301Z"
}
Run Code Online (Sandbox Code Playgroud)

Yas*_*ynh 8

这是一个例子。

{ "$date": "2018-11-10T22:26:12.111Z" }
Run Code Online (Sandbox Code Playgroud)

这样的

{
  "createdAt": { "$date": "2018-11-10T22:26:12.111Z" }
}
Run Code Online (Sandbox Code Playgroud)


Nei*_*unn 6

这样做的核心基本上是,您使用的JSON不会“保留”“数据类型”,因此会确定“日期”,而实际上只是表示为“字符串”。当然,另一方面是MongoDB本身实际上是“无模式的”,因此“数据库”没有可用的固有信息说该字段应为日期。

考虑到这一点,从您的“当前”实现到“未来”考虑,有几种方法会有所不同。

但是,您正在解析数据(并且那里有很多解析器实现),然后由“您的”应用程序逻辑来“知道”该字段实际上是“日期”,然后自行处理该转换。因此,下降到文档级别:

var obj = JSON.parse(singleJSONDoc);
obj.date_added = new Date(obj.date_added);
Run Code Online (Sandbox Code Playgroud)

这是您将在输入中每个有效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
})
Run Code Online (Sandbox Code Playgroud)

因此,“逻辑”只是从代码中的一个位置移至管理架构和“类型”的“隔离专区”。根据实现的“类型”为您完成转换。猫鼬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" }
}
Run Code Online (Sandbox Code Playgroud)

实现EJSON规范的解析器以及其他工具(例如mongoimportmongoexport)以及一些本机驱动程序实现(Java,C#,仅举两个)通常支持该功能

如果可以将输入数据处理为这种格式,则可以只使用解析器,而无需执行其他任何操作。这样做的好处是,您可以使用相同的解析器来“导出”信息,因此在将JSON数据传递给客户端时非常有用,因为现在“客户端”也可以“感知”并正确处理类型转换。

因此,简短的答案是,如果您不做任何工作,什么都不会做。MongoDB不保存架构,这取决于您的应用程序。智能的“类型”转换不是基本JSON的一部分。使用其他库和代码来处理转换。


ari*_*556 0

您应该使用对象数据建模库,例如 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
        }
});
Run Code Online (Sandbox Code Playgroud)