利用Mongodb做地理空间查询

闪电
闪电
闪电
57
文章
0
评论
2020年4月26日19:47:14 评论 70

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'
    } )
  2. 创建Model

    let goodsModel = mongoose.model(‘Goods’, goodsSchema)
  3. 插入数据

    按照以下数据格式往数据库插入数据:
    {
    "name":"名字",
    "price":12,
    "location":[经度,纬度]
    }
  4. 查看用户附近的数据

    goodsModel.find( {
        'location': {
            $near: {
                    $geometry: {
                      type: 'Point',
                      coordinates: [ parseFloat(args.longitude), parseFloat(args.latitude) ]
                    },
                    $maxDistance: 100   //100米范围内
                  }
                }
        }
    } ).limit(10).skip(0).lean().exec();

总结

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

继续阅读
weinxin
我的微信
微信扫一扫
闪电
  • 本文由 发表于 2020年4月26日19:47:14
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Mongodb地理空间查询-最佳实践 数据库

Mongodb地理空间查询-最佳实践

MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 前言 在移动开发中,经常会用到定位的功能,例如美团、饿了么、猫眼电影等应用,都...
30行代码造了一个1494start项目的轮子 Nodejs

30行代码造了一个1494start项目的轮子

1494个start的项目:minimist 30行代码轮子:argps 项目功能: 解析命令行启动用户所输入的参数,转成Object。 需要支持多个命令、重复参数合并到数组、监测无名字参数合并到_中...
一键部署项目和代码自动更新 Nodejs

一键部署项目和代码自动更新

my-deploy : 由nodejs写的一个自动更新工具,理论支持所有语言(php、java、c#)的项目,支持所有git仓库(bitbucket、github等)。 github 效果如何? 如果...
Node.js自动代码审核 Nodejs

Node.js自动代码审核

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. 简介 在团队开发中,无论是写前端(js,css,htm...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: