我有一个
.json
文件,其中包含带有日期的对象。如何确保此日期字段作为“日期”数据类型插入 mongo 中?
我需要通过node.js 完成此操作。
{
"name": "Jeff Johnson",
"email": "[email protected]",
"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
})
因此,“逻辑”只是从代码中的一个位置移动到管理架构和“类型”的“部分”。转换是根据实施的“类型”为您完成的。例如,Mongoose 开箱即用。存在其他解决方案,但这是基本前提。
最后,解决此问题的另一种方法是使用 JSON 表示本身。 MongoDB 不久前引入了一个称为 “扩展 json 语法”
的概念,这并不是从 EJSON 项目中“借用”的。 这里的总体思路是“启用”JSON 解析器(无论是序列化还是反序列化)来为您处理“类型”转换。所以基本上,虽然 JavaScript(和其他语言)有“类型”的概念,但 JSON 本身只是一种“字符串”格式。因此,这里有一些特殊的处理来以“序列化”形式“保留”该类型信息,以便可以在保留“类型”的情况下将其“反序列化”回来。
格式如下所示:
Date
这通常由实现EJSON
规范的解析器和其他工具(如 {
"name": "Jeff Johnson",
"email": "
[email protected]",
"phone": "5555555555",
"date_added": { "$date": "2014-01-22T14:56:59.301Z" }
}
和
mongoimport
)以及一些本机驱动程序实现(仅举两个例子,Java、C#)支持。如果您可以将输入数据处理为这种格式,那么您只需使用解析器即可,不需要其他任何东西来处理转换。这里的好处是,您可以使用相同的解析器来“导出”信息,因此这在将 JSON 数据传递给客户端时非常有用,现在“客户端”也可以“感知”并正确处理类型转换。
所以简短的答案是,如果你不做一些工作,什么都不会完成。 MongoDB 不保存架构,这取决于您的应用程序。并且智能“类型”转换不是基本 JSON 的一部分。使用其他库和代码来处理转换。
mongoexport
这样
{ "$date": "2018-11-10T22:26:12.111Z" }
{
"createdAt": { "$date": "2018-11-10T22:26:12.111Z" }
}
1:将JSON解析为对象 2:相应地更改值 2.1:对于日期,您可以简单地执行以下操作:
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
}
});
对于数字(整数),最好也这样存储它们;)
some_object["date_added"] = new Date(some_object["date_added"]);