【问题标题】:Is there a way to represent ISODate and ObjectID fields in JSON that MongoDB will recognize?有没有办法在 MongoDB 识别的 JSON 中表示 ISODate 和 ObjectID 字段?
【发布时间】:2012-12-19 06:37:44
【问题描述】:

我正在尝试将 JSON 文件导入节点内的 MongoDB。这是我想要做的:

db.open(function(err, db) {
  if(!err) {
    db.collection('orgs', {safe: true}, function(err, collection) {
      if (err) {
        console.log("The 'orgs' collection doesn't exist. Creating it with sample data...");
        db.collection('orgs', function(err, collection) {
          orgs = require("../data/orgs.json");
          collection.insert(orgs, {safe:true}, function(err, result) {});
        });
      }
    });
  }
});

请注意,NodeJS 可以自动将 JSON 导入为 JSON,这很好,但 JSON 不处理 ISODate 或 ObjectID 之类的对象。这是我尝试导入的 JSON 数据的片段:

./data/orgs.json:

  {
    "stub": "apple",
    "name":"Apple, Inc.",
    "timezone": "America/New_York",
    "currency": "USD",
    "plans": [
      {"planId":1, "dtStart": {"$date":"2012-12-07 12:34:56"}},
      {"planId":0, "dtStart": {"$date":"2012-12-05 23:45:02"}, "dtEnd": {"$date":"2012-12-07 12:34:56"}}
    ]
  }

我正在为 Node 使用 mongodb 本机驱动程序。

我尝试使用整数表示日期,但它不起作用。

有没有办法用 MongoDB 识别的 JSON 表示 ISODate 和 ObjectID 字段?

【问题讨论】:

  • 我们使用类似: import ejson from 'mongodb-extended-json';从'./fixtures/Animals.json'导入动物; ejson.deserialize(animals) 其中json就像{ "_id" : { "$oid" : "54ebb..." }, "created" : { "$date" : "2015-02-23T23:19:54.674+0000" }}

标签: javascript json node.js mongodb node-mongodb-native


【解决方案1】:

您不能在JSON 中存储日期和其他自定义对象,因为它仅支持字符串、数字、布尔值和null。因此,要从JSON 加载它们,您应该以某种方式从它们的字符串表示中恢复它们。当然,您可以使用BSON 代替JSON,因为它支持所有这些数据类型,但是有更好的方法来解决您的问题。

由于您已经使用require 而不是JSON.parse 来加载和解析您的JSON 数据,因此您可以多做一步并使用JavaScript 表示您的数据而不是纯JSON

var ObjectID = require('mongodb').ObjectID;

module.exports = {
  stub: "apple",
  name: "Apple, Inc.",
  timezone: "America/New_York",
  currency: "USD",
  plans: [
    {
      planId: new ObjectID("1"),
      dtStart: new Date("2012-12-07 12:34:56")
    },
    { 
      planId: new ObjectID("0"),
      dtStart: new Date("2012-12-05 23:45:02"),
      dtEnd: new Date("2012-12-07 12:34:56")
    }
  ]
}

在这种情况下,您将能够使用 new Datenew ObjectID 创建日期和对象 ID。

注意你可以用require('bson').ObjectID代替require('mongodb').ObjectID,结果是一样的。

【讨论】:

  • 谢谢 - 我想这就是我要做的。我希望保留 JSON,因为它是数据,但这似乎是最简单的方法。我读到 ISODate 可以表示为 {"$date": 1234455},但它对我不起作用。
【解决方案2】:

我们使用类似的东西:

    import ejson from 'mongodb-extended-json';
    import animals from './fixtures/Animals.json';
    const array = ejson.deserialize(animals)

json 是这样的

{ "_id" : { "$oid" : "54ebb..." }, "created" : { "$date" : "2015-02-23T23:19:54.674+0000" }}

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多