【问题标题】:How to insert date into mongo from JSON file如何将日期从 JSON 文件插入 mongodb
【发布时间】:2015-01-10 03:36:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript node.js mongodb mongodb-query


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        其核心基本上是您使用的 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 规范的解析器和mongoimportmongoexport 等其他工具以及一些本机驱动程序实现(Java、C# 等)通常支持这一点。

        如果您可以将输入数据处理成这种格式,那么您可以只使用解析器,不需要其他任何东西来处理转换。这里的好处是您可以使用相同的解析器来“导出”信息,因此这在将 JSON 数据传递给客户端时很有用,现在“客户端”也可以“感知”并正确处理类型转换。

        所以简短的回答是,如果不做一些工作,什么都做不了。 MongoDB 不保存模式,这取决于您的应用程序。智能“类型”转换不是基本 JSON 的一部分。使用其他库和代码来处理转换。

        【讨论】:

          【解决方案4】:

          这是一个例子。

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

          这样

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

          【讨论】:

          • 观察方式:强制使用"$date",所以""是强制的。后面怎么导入ISODate("same pattern used")类型
          猜你喜欢
          • 1970-01-01
          • 2023-03-13
          • 2013-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-13
          • 1970-01-01
          • 2021-08-31
          相关资源
          最近更新 更多