MongoDB 2dsphere索引失败(格式错误的几何?)

时间:2014-05-29 00:23:58

标签: mongodb geojson mongodb-indexes 2dsphere

我目前正在尝试构建一个2dsphere索引,但创建似乎失败了。

索引创建失败的文档是有效的geojson(根据geojsonlint)。

另据我所知,它遵循MongoDB“Polygon”规则。

我很感激任何帮助,因为我无法弄清楚为什么索引创建似乎失败了。

提前致谢!

db.poly.ensureIndex( { loc: "2dsphere" } )
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "ok" : 0,
        "errmsg" : "Can't extract geo keys from object, malformed geometry?: { _
id: 353, loc: { type: \"Polygon\", coordinates: [ [ [ 8.090732000000001, 53.6379
766 ], [ 8.050639500000001, 53.6250853 ], [ 8.036974600000001, 53.6286108 ], [ 7
.994035500000001, 53.6016978 ], [ 8.0120927, 53.59855020000001 ], [ 8.0102720000
00001, 53.5883803 ], [ 8.023379, 53.5867745 ], [ 8.0148004, 53.5832729 ], [ 8.02
6839500000001, 53.57895840000001 ], [ 8.0271685, 53.5727671 ], [ 8.0432450000000
01, 53.57190120000001 ], [ 8.0386477, 53.565241 ], [ 8.0192488, 53.5609644 ], [
8.030192100000001, 53.5508096 ], [ 8.037298, 53.5565769 ], [ 8.041402400000001,
53.55249540000001 ], [ 8.030647100000001, 53.53854200000001 ], [ 8.0381080000000
01, 53.5275022 ], [ 8.048501400000001, 53.5243656 ], [ 8.051459700000001, 53.509
912 ], [ 8.091510100000001, 53.50258460000001 ], [ 8.153839000000001, 53.5148059
0000001 ], [ 8.1708242, 53.53993010000001 ], [ 8.164240300000001, 53.5287913 ],
[ 8.1562255, 53.531339 ], [ 8.1700993, 53.54524050000001 ], [ 8.150740200000001,
 53.5596328 ], [ 8.1539377, 53.56452330000001 ], [ 8.1408203, 53.58015880000001
], [ 8.155694800000001, 53.5858101 ], [ 8.1496093, 53.60191990000001 ], [ 8.1234
503, 53.5984032 ], [ 8.090732000000001, 53.6379766 ] ] ] } }",
        "code" : 16755
}

4 个答案:

答案 0 :(得分:2)

将索引应用于“loc”(GeoJSON字段)。但是,请确保您的坐标按经度,纬度(不是纬度,经度)的顺序指定。

根据http://docs.mongodb.org/manual/applications/geospatial-indexes/#spherical的文档:

  

使用此坐标轴将您的位置数据存储为GeoJSON对象   顺序:经度,纬度。坐标参考系统   GeoJSON使用WGS84数据。

另外,根据http://geojson.org/geojson-spec.html#positions的GeoJSON规范:

  

一个位置由一组数字表示。必须有   至少两个元素,可能更多。必须遵循元素的顺序   x,y,z顺序(东,北,海拔坐标为a   投影坐标参考系,或经度,纬度,   地理坐标参考系中坐标的高度)。   允许任何数量的附加元素 - 解释和   附加元素的含义超出了本文的范围   说明书

答案 1 :(得分:2)

坐标中有一个交叉点,但我无法通过geojsonlint.com看到它,因为它并不明显!

MongoDB不允许插入线条相交的多边形。

答案 2 :(得分:0)

如果您的收藏集中有多个文档,并且其中至少有一个文档包含' loc'字段为NULL或EMPTY。

因此,请确保您没有任何文件,其中包含' loc'字段为NULL或EMPTY。

查询:db.poly.find(" loc":{$ exists:true,$ eq:""});

注意: 您需要将索引添加到' loc'领域,而不是' loc.coordinates'字段。

答案 3 :(得分:-2)

因此解决方案只是在loc.coordinates而不是loc

上构建索引
db.coor.ensureIndex({"loc.coordinates": "2dsphere"})

注意2d索引支持不同的格式,您可以在document中找到示例。虽然loc不是其中之一。

我不明白为什么你有嵌套数组。