如何获取在其半径内包含给定位置的记录?蒙古数据库

Posted

技术标签:

【中文标题】如何获取在其半径内包含给定位置的记录?蒙古数据库【英文标题】:How to get the records which contains the given location in its radius? Mongodb 【发布时间】:2017-04-13 20:20:17 【问题描述】:

我的 DB Mongoose 架构如下所示。

var blogSchema = mongoose.Schema(
blogText:  type: String,
location: type: [Number],
radius : type: Number,
);
blogSchema.index(location: 2dsphere);
 ... .. .. ...

示例数据如下所示

 
"_id" : 58ef3f1919f99e3bb37ce21b, 
"location" : [
    77.706106, 
    12.9447252
], 
"radius" : "4000",
"blogText" : "News 1 .....",
 
"_id" : 58ef3f19b37ce21b19f99e3b, 
"location" : [
    77.709979, 
    12.9703882
], 
"radius" : "1000",
"blogText" : "Health 1 .....",
 
"_id" : 58ef3f1919f99e3bb37ce21b, 
"location" :[
    77.7060119, 
    12.9488936
], 
"radius" : "3500",
"blogText" : "Lifestyle 1 .....",
 
"_id" : 58ef3f1919f99e3bb37ce21b', 
"location" :  [
    77.709979, 
    12.9703882
], 
"radius" : "100",
"blogText" : "Sports.....",
 
"_id" : 58ef3f1919f99e3bb37ce21b', 
"location" : [
    77.706106, 
    12.9447252
], 
"radius" : "800",
"blogText" : "Tech ....."

我只需要获取那些在博客位置和半径下包含用户位置的博客。

我的查询看起来像。它根据请求的位置和半径获取数据。

db.blogs.find(location: $geoNear: $geometry: type: "Point",coordinates: [77.706106,12.9447252]$maxDistance: 500,$minDistance: 0 )

提前致谢

【问题讨论】:

【参考方案1】:

从这里修改为answer,这可能对你有用。

使用聚合通过具有三个阶段的管道推送文档。

1)$geoNear:查找所需坐标附近的所有文档,并返回生成的distanceField,称为distance

2) $project:使用在第 1 阶段找到的 $distance 并从 $radius 中减去,存储为增量。

3)$match:过滤掉所有小于或等于0的delta。

db.blogs.aggregate([
  
    '$geoNear' : 
      near : [77.706106,12.9447252],
      distanceField : 'distance',
      includeLocs: 'location',
      spherical : true
    
  , 
  
    '$project' : 
      name : 1,
      location : 1,
      delta : 
        '$subtract' : [
          '$radius', 
          '$distance'
        ]
      
    
  , 
  
    '$match' : 
      delta :  '$gte' : 0 
    
  
])

【讨论】:

你是对的,我错误地更改了一个字段的名称。上面是固定的。 现在不能从字符串中减去一个 numberdouble。 我没有意识到您将半径存储为字符串。也可能有一种方法可以投影,但最佳做法是将半径存储为 int 或 float。 我将其存储为数字,您可以看到架构半径:type: Number 我不知道 mongoose orm,但如果您的示例数据正确,那么您的半径将被存储为字符串。

以上是关于如何获取在其半径内包含给定位置的记录?蒙古数据库的主要内容,如果未能解决你的问题,请参考以下文章

找到给定半径内的附近位置

获取半径内的位置

SQL查询位置半径内的总点数

查找具有纬度和经度的记录[重复]

给定 GPS 的地理位置,如何在给定的 x 米半径内找到纬度和经度

从 Laravel 中的坐标获取半径内的用户