如何获取包含半径内给定位置的记录? MongoDB的

时间:2017-04-13 20:20:18

标签: mongodb geolocation geospatial

我的数据库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 个答案:

答案 0 :(得分:1)

通过此修改answer,这可能适合您。

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

1)$geoNear:找到所需坐标附近的所有文档,然后返回一个名为distanceField的已生成distance

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

3)$match:过滤掉所有小于或等于零的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 }
    }
  }
])