美文网首页我爱编程
地图距离排序一(mongodb篇)

地图距离排序一(mongodb篇)

作者: 耐撕鹏鹏 | 来源:发表于2018-05-13 23:03 被阅读44次

在使用外卖或团购 App 筛选商家时,我们经常会用到一个功能,叫作按照离我最近排序。在使用共享单车时,App 会自动帮我们搜索出,距离我们最近几公里内的单车。那么这两种场景,在服务端要如何实现呢?今天我们将使用 mongodb 来实现这两种场景。

首先我们准备数据集,创建一个 location 库,然后插入一些数据。如下:

例:
db.location.insert({"lng":经度,"lat":纬度,"loc":[lng,lat]});
db.location.insert({"lng":1,"lat":1,"loc":[1,1]});
db.location.insert({"lng":2,"lat":2,"loc":[2,2]});
db.location.insert({"lng":3,"lat":3,"loc":[3,3]});
db.location.insert({"lng":-1,"lat":-1,"loc":[-1,-1]});
db.location.insert({"lng":-2,"lat":-2,"loc":[-2,2]});   
db.location.insert({"lng":-3,"lat":-3,"loc":[-3,-3]});

数据集准备好了之后,我们需要为 location 加上地图索引。mongodb 提供的地图索引有两种,分别是 2d 和 2dsphere。2d 索引通过二维平面记录点坐标,支持在平面几何中计算距离,而 2dsphere 则支持在球面上进行距离的计算,并且支持 mongodb 的所有地理空间查询方法。简单的理解,2dsphere 是 2d 的增强版。根据官方推荐,如果你的mongodb版本大于2.6,那么就用 2dsphere 索引 。如下:

db.location.ensureIndex({"loc":"2dsphere"})

索引加好后,我们就可以来实现按照离我最近排序了,姿势如下:

db.location.find({
    "loc":{
        "$nearSphere":{
            "$geometry":{
                "type":"Point",
                "coordinates":[0,0]
            }
        }
    }
})

按照离我最近排序,除了使用 $nearSphere 查询外,我们还可以使用 aggregate 来实现。

使用 aggregate 有两个好处。1.我们在进行排序的后,可以返回两点之间的距离。2.我们可以进行更为复杂的排序,例如我们可以先根据某个字段进行排序,然后该字段相同的情况下再根据距离排序。

使用 aggregate 查询时,我们还可以返回两点之间的距离,其中 distanceField 可以对距离字段进行重命名。姿势如下:

db.location.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ 0 , 0 ] },
        distanceField: "distance",
        spherical: true
     }  
   }
])

如果我们希望查询以某个点为中心的圆几公里以内的数据,那你的姿势可以如下:

db.location.find({
    "loc":{
        "$geoWithin":{
            "$centerSphere":[
                [
                    0,0
                ],
                 0.025 //单位为弧度
            ]
        }
    }
})

最后,mongodb 提供了许多更为复杂的查询方法,有需要的同学可以自己到官网查看。https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/

相关文章

  • 地图距离排序一(mongodb篇)

    在使用外卖或团购 App 筛选商家时,我们经常会用到一个功能,叫作按照离我最近排序。在使用共享单车时,App 会自...

  • 地图距离排序二(Java篇)

    我们在 mongodb 篇中介绍了如何使用 mongodb 进行地图的距离排序和筛选,今天我们来介绍一下,用 Ja...

  • 使用MongoDB地理空间索引2dsphere聚合附近的文档并按

    基于MongoDB数据库,实现一个后端分页查询接口,输出指定坐标点附近的文档,并计算距离并返回。类似地图app基于...

  • MongoDB 排序

    MongoDB sort()方法 在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通...

  • MongoDB Triks

    1. MongoDB sort()方法 在MongoDB中使用使用sort()方法对数据进行排序,sort()方法...

  • MongoDB查询结果排序 --- 2022-04-03

    本章介绍,MongoDB查询结果排序,类似MYSQL order by的用法,MongoDB的分页查询通过Curs...

  • mongoDB - Collation

    Collation特性(排序规则) 是mongoDB 3.4 版本新增的。 允许MongoDB的用户根据不同的语言...

  • mongoDB排序

    问题 之前mongodb中的数据并不是很多,然后做排序没问题,后来数据多了之后,排序时报错.错误内容如下: 分析 ...

  • mongodb——内存

    sort操作内存溢出 报错 这个异常出自mongodb的sort操作。当mongodb无法从索引获取排序顺序时,会...

  • MongoDB 条件查询和排序

    MongoDB 提供了丰富的查询功能,包括条件组合、反向查询、查询结果过滤、排序等,借助 MongoDB 多样化的...

网友评论

    本文标题:地图距离排序一(mongodb篇)

    本文链接:https://www.haomeiwen.com/subject/prprdftx.html