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ことは、サポートする必要があるとは思いません。インデックスの解像度が十分に高くないため、2 つのポイントが同じではないことがわかります。S2 インデックスの実装では、最小辺が 500m の「セル」のみを使用し、ポイントは互いに約 65 メートル離れています。

https://docs.google.com/presentation/d/1Hl4KapfAENAOf4gv-pSngKwvS_jwNVHRPZTTDzXXn6Q/view#slide=id.i0には、インデックスの仕組みを説明する魅力的なプレゼンテーションがあります。

今のところ、問題の解決策はないと思いますが、さらに調査を行います。

于 2013-07-24T09:20:17.010 に答える