1

我尝试使用 2dsphere 唯一索引将地理点插入 mongodb,但它会引发许多重复键错误。

一个简单的重现演示:

> version()
2.4.5
> use geo
> db.test.ensureIndex( { loc : "2dsphere" }, unique=true )
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.3736642,  23.04469194 ] }})
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.3734775,  23.04609556 ] }})
E11000 duplicate key error index: geo.test.$loc_2dsphere  dup key: { : "1f22000102222113" }

为什么这些完全不同的点会引发重复键错误?


更新:

我尝试了其他测试,它似乎与准确性有关。

> db.test.ensureIndex( { loc : "2dsphere" }, unique=true )
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.373,  23.044 ] }})
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.373,  23.045 ] }})
E11000 duplicate key error index: geo.test.$loc_2dsphere  dup key: { : "1f22000102222113" }
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.373,  23.046 ] }})
E11000 duplicate key error index: geo.test.$loc_2dsphere  dup key: { : "1f22000102222113" }
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.373,  23.047 ] }})
E11000 duplicate key error index: geo.test.$loc_2dsphere  dup key: { : "1f22000102222113" }
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.373,  23.048 ] }})
E11000 duplicate key error index: geo.test.$loc_2dsphere  dup key: { : "1f22000102222113" }
> db.test.insert({"loc" : { "type" : "Point", "coordinates" : [  113.373,  23.049 ] }})

在此测试中 23.045 到 23.048 失败,只有 23.044 23.049 成功。

4

1 回答 1

3

我确实可以重现这一点。2dsphere我认为不应该支持使用唯一索引。索引的分辨率不够高,看你的两个点不一样。我们对 S2 索引的实施仅使用最小边长为 500m 的“单元”,并且您的点彼此相距约 65 米。

https://docs.google.com/presentation/d/1Hl4KapfAENAOf4gv-pSngKwvS_jwNVHRPZTTDzXXn6Q/view#slide=id.i0有一个引人入胜的演示文稿,解释了索引的工作原理。

但是,就目前而言,我认为您的问题没有解决方案,但我会进行更多调查。

于 2013-07-24T09:20:17.010 回答