美文网首页iOS开发swiftIT
利用Mongodb做地理空间查询

利用Mongodb做地理空间查询

作者: kelvv | 来源:发表于2016-07-24 22:53 被阅读821次

MongoDB
是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

前言

在移动开发中,经常会用到定位的功能,例如美团、饿了么、猫眼电影等的app,都是使用了移动端定位,然后查找出自己地理位置附近的一些服务、信息。

所以本篇文章将会以Mongodb为数据库,讲述如何在数据库层级进行定位查询。

分析

举个例子,我们需要做一个app,商家可以把自己的商品发布到app上,用户打开app查看离自己从近到远的商品。

如果没有地理位置的需求,那好办,直接插库然后查库就ok了,但是如果用到了地理位置,则需要用到Mongodb的一些位置功能。

Mongodb有一种地理空间索引,利用它可以进行经纬度的计算,下面继续介绍如何使用该功能。

实现

下面以Nodejs+mongoose为例

  1. 创建Schema:
const mongoose = require( 'mongoose' );
let goodsSchema = new mongoose.Schema( {
    name: String,
    price: Number,
    location: {
        type: [ Number ],
        index: {
            type: '2dsphere',
            sparse: true
        }
    }
}, {
    collection: 'Goods'
} )
  1. 创建Model
let goodsModel = mongoose.model(‘Goods’, goodsSchema)
  1. 插入数据
按照以下数据格式往数据库插入数据:
{
    "name":"名字",
    "price":12,
    "location":[经度,纬度]
}
  1. 查看用户附近的数据
goodsModel.find( {
        'location': {
            $near: {
                    $geometry: {
                      type: 'Point',
                      coordinates: [ parseFloat(args.longitude), parseFloat(args.latitude) ]
                    },
                    $maxDistance: 100   //100米范围内
                  }
                }
        }
    } ).limit(10).skip(0).lean().exec();

总结

本次主要分享位置索引的用法,十分实用的一个功能,demo没有做得那么手把手,但是主要的骨架是出来了,可以自由发挥~

请作者喝茶:


利用Mongodb做地理空间查询

相关文章

网友评论

  • SweetMain:请教一下,索引怎么建?
    kelvv:2dsphere
  • 2049a2f18231:mongoose既然已经计算出了附近符合要求的数据,肯定已经算出来了这个距离,而一般前端都会需要一个距离您xx米的显示需求,因此,想问一下,是否有方法让返回数据夹带上这个距离呢?
    2049a2f18231:@kelvv 懂了,十分感谢,已经解决该问题。
    kelvv:如果想要获取距离的话,并且按照距离进行排序,可以使用mongoose的聚合运算,$geoNear , 详情可以参考官网,如果需要demo,可以加我微信 13516534108
  • 菜芽928:{
    name: '设备1',
    loc: [40.230313208997, 116.25888228808]
    }
    插入数据格式如上时,始终插入不进去
    菜芽928:@kelvv nice,谢谢
    kelvv:loc: [116.25888228808, 40.230313208997]
    kelvv:@chaozhou 你的位置反了
  • 不作不死不舒服斯基:你好,为什么我写之后一直返回空数据啊,这是我的主要代码
    User.find({
    location: {
    'nearSphere': [1, 3],
    'maxDistance': 10000000
    }
    })
    .exec(function (err, users) {
    if (err) {
    return next(err)
    }
    res.send({
    data: users
    })
    })
  • 醉酒肆之:看完傻傻不知用于Android,IOS,Web
    kelvv:@醉酒肆之 这是后台需要弄的,android,ios,web需要使用定位服务找到用户的经纬度,传给后台即可

本文标题:利用Mongodb做地理空间查询

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