Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDb地理定位_Node.js_Mongodb_Mongoose_Geolocation - Fatal编程技术网

Node.js MongoDb地理定位

Node.js MongoDb地理定位,node.js,mongodb,mongoose,geolocation,Node.js,Mongodb,Mongoose,Geolocation,我有一个叫社区的收藏。社区具有地理位置和半径。 假设用户想要加入一个社区,那么我从db获取他的地理位置(如果可用)或上次保存的位置。然后检查用户是否在社区范围内,然后允许他加入社区。 我拥有的唯一数据是用户位置,我必须找到该用户所在的所有社区的列表。 答案由链接中的官方MongoDB文档帮助构建 查找5公里范围内的位置的查询应如下所示: db.community.find({ geolocation: { { $geoWithin: { $centerSphere: [

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

答案由链接中的官方MongoDB文档帮助构建

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

db.community.find({
  geolocation: {
    { $geoWithin:
      { $centerSphere: [ [ uLongitude, uLatitude ], 5 / 6378.1 ] }
    }
  }
})
说明:

  • $geointen
    查找指定区域内的位置 根据它的论点
  • $centerSphere
    用于表示圆形区域 通过以弧度为单位指定中心和半径
  • 5/6378.1
    用于将5公里转换为弧度。有关官方MongoDB文档的更多信息,请参见第页
文件还规定:

$geointen不会按任何特定顺序返回文档,因此 可以先向用户显示最远的文档

要以排序方式查找文档,请使用此查询,该查询是使用以下位置的文档构建的:

说明:

  • $nearSphere
    返回半径范围内(
    5 km
    )的文档 以排序方式从中心(
    uLongitude
    uloglatude
    )开始, 离中心最近到最远
编辑1: 根据comments中的讨论,通过MongoDB文档,您还可以使用如下聚合查询来获取距离:

db.places.aggregate( [
   {
      $geoNear: {
         near: { type: "Point", coordinates: [ uLongitude, uLatitude ] },
         spherical: true,
         query: {
           // Pass Any Other Query Conditions in this object
         },
         distanceField: "calcDistance"
      }
   }
] )
说明: 您可以将任何其他查询条件传递给
$geoNear
阶段中的
query
参数,您应该在查询结果文档中的
calcDistance
字段中获取距离。尝试下面的例子

编辑2:
要查找其球体范围与用户坐标相交的社区,社区位置必须存储为
多边形
,不幸的是,在您的情况下并非如此,否则,您可以使用简单的
$geoIntersect
查询

您能否添加
社区
用户
集合中的数据样本?这将有助于社区成员尝试这些问题,并以准确的方式回答您的问题。提前谢谢!最小样本数据。community.name=“Abcd”;community.geolocation={type:“Point”,坐标:[]};community.radius=10//以公里为单位。user.geolocation={类型:“点”,坐标:[]};两者都是2dsphere索引。社区名称、地理位置点坐标、半径。对于用户,我们只有他的lng,lat。这没有帮助。请从两个集合中添加2或3个文档。我认为不需要添加更多数据。对于此查询,仅社区名称、地理位置点lng和lat、radius是社区收集的足够数据。而对于用户来说,只考虑我们有他的LNG,LAT对我们可用。使用用户的lng、lat查询社区集合[名称、地理位置(lng、lat)、半径]。该项目是在保密协议,所以不能透露任何字段。谢谢你的回答,但我已经实现了相同的查询
db.places.aggregate( [
   {
      $geoNear: {
         near: { type: "Point", coordinates: [ uLongitude, uLatitude ] },
         spherical: true,
         query: {
           // Pass Any Other Query Conditions in this object
         },
         distanceField: "calcDistance"
      }
   }
] )