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

时间:2013-01-04 19:32:50

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

我正在尝试将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数据的信息:

./数据/ 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本机驱动程序。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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 Date来创建日期和对象ID。

N.B。您可以使用new ObjectID代替require('bson').ObjectID,结果将是相同的。

答案 1 :(得分:0)

我们使用类似的东西:

    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" }}