在Mongo中,$ near和$ nearSphere有什么区别?

时间:2016-07-10 00:02:27

标签: mongodb

我阅读了文档,并且不太清楚两者之间的区别。

我发现的唯一区别是在nearSphere中明确表示Mongo使用球面几何计算$ nearSphere的距离。但这可以使用$ near来实现,不是吗?

1 个答案:

答案 0 :(得分:11)

关键字为sphere,用于区分$near$nearSphere

如您所知,$nearSphere表示使用球面几何计算距离。这与地球map projectiondistortion)有关。 MongoDB 2d indexes基于CartesianMongoDB 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

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测试的。

另见Geospatial Indexes and Queries