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

时间:2014-11-13 04:22:57

标签: javascript node.js mongodb mongodb-query

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

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

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

4 个答案:

答案 0 :(得分:3)

这个的核心基本上就是你正在使用的JSON没有"保留" "数据类型"这样一个" date"确定并且它实际上只是表示为"字符串"。另一方面当然是MongoDB本身实际上是"无模式",因此没有固有的信息可用于"数据库"说这个字段应该是约会。

考虑到这一点,有一些方法可能与您的"当前"实施到未来"考虑。

然而,您正在解析数据(并且有许多解析器实现),那么它取决于您的"应用逻辑“知道”#34;这个字段实际上是一个" date",然后处理该翻译本身。所以到文档级别:

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

这将是您将根据输入中的每个有效JSON文档实现的代码的基础知识,这是一个非常基本的假设,即输入可以一次读取一行。对于"流解析器"同样的方法也是不同的。然后给你提供基本对象进行修改,甚至一些图书馆可能会支持" hooks"允许您自定义已解析的对象。

作为另一种方法,逻辑可以内置于您的应用程序自己的概念" Schema"。这就是大多数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
})

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

最后,另一种解决方法是在JSON表示本身。 MongoDB前段时间引入了一个名为"extended json syntax"的概念,这个概念已经被借用了#34;来自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的一部分。使用其他库和代码来处理转换。

答案 1 :(得分:1)

这里是一个例子。

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

那样

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

答案 2 :(得分: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
        }
});

答案 3 :(得分:0)

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

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

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

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