我有一个叫社区的收藏品。社区有地理位置和半径。假设用户想要加入一个社区,然后我从数据库获取他的地理位置(如果可用)或最后保存的位置。然后检查用户是否在社区半径内,然后允许他加入社区。我所拥有的唯一数据是用户位置,我必须找到该用户所在的所有社区的列表。

发布于 2019-10-05 16:09:42
由this链接上的官方MongoDB文档帮助构建的答案。
在5 for 范围内查找位置的查询应该如下所示:
db.community.find({
geolocation: {
{ $geoWithin:
{ $centerSphere: [ [ uLongitude, uLatitude ], 5 / 6378.1 ] }
}
}
})说明:
$geoWithin查找由其argument$centerSphere指定的区域内的位置,用于通过指定中心来表示圆形区域,而radians5 / 6378.1中的半径用于将5公里转换为弧度。有关官方MongoDB docs的更多信息,请参见this页面
文件还规定:
$geoWithin不会以任何特定的顺序返回文档,因此它可能会首先向用户显示最远的文档。
要以排序的方式查找文档,请使用以下查询,该查询是使用this location中的文档构造的
var METERS_PER_KM = 6378.1
db.community.find({
geolocation: {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [ -73.93414657, 40.82302903 ]
},
$maxDistance: 5 * METERS_PER_KM
}
}
});Explanation:
$nearSphere从中心(uLongitude,uLatitude)以排序的方式返回半径范围(5 km)内的文档,距离中心最近。编辑1:根据评论中的讨论,通过MongoDB文档,您可以使用如下的聚合查询来获得距离:
db.places.aggregate( [
{
$geoNear: {
near: { type: "Point", coordinates: [ uLongitude, uLatitude ] },
spherical: true,
query: {
// Pass Any Other Query Conditions in this object
},
distanceField: "calcDistance"
}
}
] )Explanation:您可以在$geoNear阶段将任何其他查询条件传递给query参数,并且您应该在查询结果文档的calcDistance字段中获得距离。尝试按照示例here进行操作。
编辑2:要查找其球体范围与用户坐标相交的社区,社区位置必须存储为Polygon,不幸的是,在您的情况下这不是真的,否则,您可以使用简单的$geoIntersect查询。Link to example
https://stackoverflow.com/questions/58245807
复制相似问题