其核心基本上是您使用的 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 开箱即用 Date。存在其他解决方案,但这是基本前提。
最后,解决此问题的另一种方法是 JSON 表示本身。 MongoDB 前段时间引入了一个称为"extended json syntax" 的概念,这显然是从EJSON 项目中“借用”的。
这里的总体思路是“启用” JSON 解析器,无论是序列化还是反序列化,以便为您处理“类型”转换。所以基本上,虽然 JavaScript(和其他语言)有“类型”的概念,但 JSON 本身只是一种“字符串”格式。所以这里有一些特殊的处理来以“序列化”形式“保留”该类型信息,以便可以在保留“类型”的情况下将其“反序列化”。
格式如下所示:
{
"name": "Jeff Johnson",
"email": "jeff@gmail.com",
"phone": "5555555555",
"date_added": { "$date": "2014-01-22T14:56:59.301Z" }
}
实现EJSON 规范的解析器和mongoimport 和mongoexport 等其他工具以及一些本机驱动程序实现(Java、C# 等)通常支持这一点。
如果您可以将输入数据处理成这种格式,那么您可以只使用解析器,不需要其他任何东西来处理转换。这里的好处是您可以使用相同的解析器来“导出”信息,因此这在将 JSON 数据传递给客户端时很有用,现在“客户端”也可以“感知”并正确处理类型转换。
所以简短的回答是,如果不做一些工作,什么都做不了。 MongoDB 不保存模式,这取决于您的应用程序。智能“类型”转换不是基本 JSON 的一部分。使用其他库和代码来处理转换。