2

我正在尝试将 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.js 使用 mongodb 本机驱动程序。

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

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

4

2 回答 2

3

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

由于您已经使用require 而不是JSON.parse加载和解析 JSON 数据,因此您可以再做一步并使用JavaScript数据的表示而不是 pure 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,结果将是相同的。

于 2013-01-04T20:08:00.087 回答
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" }}

于 2019-12-04T17:27:30.820 回答