有没有一种方法可以在JSON中表示ISODate和ObjectID字段,以便MongoDB可以识别?

3

我正在尝试在node中将一个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原生驱动程序。

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

有没有一种方法可以在JSON中表示ISODate和ObjectID字段,以便MongoDB可以识别?


我们使用类似以下的代码:import ejson from 'mongodb-extended-json'; import animals from './fixtures/Animals.json'; ejson.deserialize(animals)其中,json 数据如下: { "_id" : { "$oid" : "54ebb..." }, "created" : { "$date" : "2015-02-23T23:19:54.674+0000" }} - malix
2个回答

3
您不能将日期和其他自定义对象存储在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},但对我不起作用。 - Scott Switzer

3

我们使用类似以下的方式:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接