使用mongodb 2dsphere唯一索引重复键错误

时间:2013-07-24 09:07:18

标签: mongodb indexing geometry geospatial

我尝试使用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成功。

1 个答案:

答案 0 :(得分:3)

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

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

但是现在,我不认为你的问题有解决办法,但我会做更多的调查。