我阅读了文档,并且不太清楚两者之间的区别。
我发现的唯一区别是在nearSphere中明确表示Mongo使用球面几何计算$ nearSphere的距离。但这可以使用$ near来实现,不是吗?
答案 0 :(得分:11)
关键字为sphere
,用于区分$near和$nearSphere。
如您所知,$nearSphere
表示使用球面几何计算距离。这与地球map projection(distortion)有关。 MongoDB 2d indexes基于Cartesian且MongoDB 2dsphere indexes基于Geodesic的位置。
足够的理论,让我们使用一些例子。我们假设我们有两份文件如下:
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分2d
位置数据索引定义为legacy coordinate pairs 索引: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"}
]
请参阅上面示例的gist: JS test script。这是使用MongoDB v3.4.4测试的。