キーワードはsphere
です $near
を区別する および
ご存知のとおり、$nearSphere
球面幾何学を使用して距離を計算すると述べられています。これは、地球の地図投影
に関連しています。 (歪み
)。 MongoDB2dインデックス
デカルト
に基づいています および
十分な理論ですが、いくつかの例を使用してみましょう。以下のように2つのドキュメントがあるとしましょう:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
両方のオペレーターのマニュアルには、使用できることが明記されています:
インデックス:2dsphere、クエリ:GeoJSON
db.map.createIndex({"location": "2dsphere"});
db.map.find({"location":{"$nearSphere":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ] }}}});
db.map.find({"location":{"$near":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ]}}}});
この場合、インデックスは2dsphere
に保存されているため、両方のクエリは同じ結果を返します。 。
結果:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
インデックス:2d、クエリ:レガシー座標
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
ここで区別が行われ、$nearSphere
の結果が表示されます $near
はインデックスに関係なく、球形に計算されます。 フラットプロジェクションで計算されます。
結果:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
要点:JSテストスクリプト を参照してください。 上記の例の。これは、MongoDBv3.4.4を使用してテストされました。
Geospatial Indexes andQueries も参照してください。 。