利用Mongodb做地理空间查询

mylimo 8年前
   <p>MongoDB</p>    <p>是一个基于分布式文件存储的数据库。由 <a href="/misc/goto?guid=4959554056197868718" rel="nofollow,noindex">C++</a> 语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。</p>    <h2>前言</h2>    <p>在移动开发中,经常会用到定位的功能,例如美团、饿了么、猫眼电影等的app,都是使用了移动端定位,然后查找出自己地理位置附近的一些服务、信息。</p>    <p>所以本篇文章将会以Mongodb为数据库,讲述如何在数据库层级进行定位查询。</p>    <h2>分析</h2>    <p>举个例子,我们需要做一个app,商家可以把自己的商品发布到app上,用户打开app查看离自己从近到远的商品。</p>    <p>如果没有地理位置的需求,那好办,直接插库然后查库就ok了,但是如果用到了地理位置,则需要用到Mongodb的一些位置功能。</p>    <p>Mongodb有一种地理空间索引,利用它可以进行经纬度的计算,下面继续介绍如何使用该功能。</p>    <h2>实现</h2>    <p>下面以Nodejs+mongoose为例</p>    <ol>     <li> <p>创建Schema:</p> <pre>  <code class="language-javascript">const mongoose = require( 'mongoose' );  let goodsSchema = new mongoose.Schema( {   name: String,   price: Number,   location: {       type: [ Number ],       index: {           type: '2dsphere',           sparse: true       }   }  }, {   collection: 'Goods'  } )</code></pre> </li>     <li> <p>创建Model</p> <pre>  <code class="language-javascript">let goodsModel = mongoose.model(‘Goods’, goodsSchema)</code></pre> </li>     <li> <p>插入数据</p> <pre>  <code class="language-javascript">按照以下数据格式往数据库插入数据:  {   "name":"名字",   "price":12,   "location":[经度,纬度]  }</code></pre> </li>     <li> <p>查看用户附近的数据</p> <pre>  <code class="language-javascript">goodsModel.find( {       'location': {           $nearSphere: [               parseFloat( 经度 ),               parseFloat( 纬度 )           ],           $maxDistance: 1000       }   } ).limit(10).skip(0).lean().exec();</code></pre> </li>    </ol>    <h2>总结</h2>    <p>本次主要分享位置索引的用法,十分实用的一个功能,demo没有做得那么手把手,但是主要的骨架是出来了,可以自由发挥~</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/9c8319739bee</p>    <p> </p>