首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDb地理位置

MongoDb地理位置
EN

Stack Overflow用户
提问于 2019-10-05 14:05:05
回答 1查看 132关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2019-10-05 16:09:42

this链接上的官方MongoDB文档帮助构建的答案。

5 for 范围内查找位置的查询应该如下所示:

代码语言:javascript
复制
db.community.find({
  geolocation: {
    { $geoWithin:
      { $centerSphere: [ [ uLongitude, uLatitude ], 5 / 6378.1 ] }
    }
  }
})

说明:

  • $geoWithin查找由其argument
  • $centerSphere指定的区域内的位置,用于通过指定中心来表示圆形区域,而radians
  • 5 / 6378.1中的半径用于将5公里转换为弧度。有关官方MongoDB docs

的更多信息,请参见this页面

文件还规定:

$geoWithin不会以任何特定的顺序返回文档,因此它可能会首先向用户显示最远的文档。

要以排序的方式查找文档,请使用以下查询,该查询是使用this location中的文档构造的

代码语言:javascript
复制
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从中心(uLongitudeuLatitude)以排序的方式返回半径范围(5 km)内的文档,距离中心最近。

编辑1:根据评论中的讨论,通过MongoDB文档,您可以使用如下的聚合查询来获得距离:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58245807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档