MongoDB 带有 geojson 的畸形几何
MongoDB Malformed Geometry with 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 索引将一个点插入 table,全部通过 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/
第一个观察:你不需要在location结构中引入loc
路径。
此外,您甚至不需要在 Lead
架构中为您的 location
字段定义单独的架构。
试试这个:
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`
使用 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 索引将一个点插入 table,全部通过 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/
第一个观察:你不需要在location结构中引入loc
路径。
此外,您甚至不需要在 Lead
架构中为您的 location
字段定义单独的架构。
试试这个:
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`