使用geojson进行MongoDB格式错误的几何

时间:2015-04-10 01:02:30

标签: javascript node.js mongodb mongoose geojson

使用MongoDB v2.6.5

当我尝试将geojson文档保存到数据库时,我收到以下错误:

name: 'MongoError',
  code: 16755,
  err: 'insertDocument :: caused by :: 16755 Can\'t extract geo keys from object, malformed geometry?: { _id: ObjectId(\'55271b90d075728028d4c9e1\'), ..., location: [ { _id: ObjectId(\'55271b90d075728028d4c9e3\'), loc: { type: "Point", coordinates: [ -105.01621, 39.57422 ] } } ] } ], status: [ "lead" ], created: new Date(1428626320406), lastName: "Doe", firstName: "John", __v: 0 }' }

我正在尝试使用2dsphere索引将Point插入表中,所有索引都通过MongooseJS进行管理,如下所示。

var GeoAddressSchema = new Schema({
    // Only holds points.
    loc: {
        type: { type: String },
        coordinates: []
    }
});


var Lead = new Schema({
    // Other fields  ...
    location: [GeoAddressSchema],
    // ...
});

LeadAddressSchema.index({ location: '2dsphere' });

正在保存的geojson:

{ type: "Point", coordinates: [ -111.855211, 33.58513 ] }

geojson根据:http://geojsonlint.com/有效,如果我用引号括起字段,但我不需要这样做(并且不能用于Mongo afaik)。

任何人都知道为什么会失败?看起来很正确。

参考链接

MongoDB GeoJSON:http://docs.mongodb.org/manual/reference/geojson/

MongoDB 2dSphere:http://docs.mongodb.org/manual/core/2dsphere/

1 个答案:

答案 0 :(得分:3)

首先观察:您不需要在位置结构中引入loc路径。

此外,您甚至无需为location架构中的Lead字段定义单独的架构。

试试这个:

var Lead = new Schema({
  // Other fields  ...
  location: {
    type: {
      type: 'String',
      default: 'Point'  // and optionally skip including `type: String` everywhere
    },
    coordinates: {
      type: [Number]
    }
  },
  // More fields ...
});

LeadAddressSchema.index({ location: '2dsphere' });

我遇到的另一个问题是,在计算和测试解决方案时,2dsphere索引会搞砸。因此,在对架构进行结构更改后,尝试删除索引,甚至更好地收集集合。

> db.lead.drop();  // on the mongo console`