巧妙的利用Mongodb做地理空間查詢
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
在移動(dòng)開(kāi)發(fā)中,經(jīng)常會(huì)用到定位的功能,例如美團(tuán)、餓了么、貓眼電影等的app,都是使用了移動(dòng)端定位,然后查找出自己地理位置附近的一些服務(wù)、信息。
地理位置索引是MongoDB早已被用戶所熟知的特性,其球面(Spherical)和平面(Flat)兩種模式,提供了豐富的地址位置的表示方式,如2d、2dsphere和GeoJSON等,對(duì)于移動(dòng)App,如地圖軟件、打車(chē)軟件、外賣(mài)軟件,MongoDB強(qiáng)大的地理位置索引功能使其最佳選擇;此外,對(duì)于物聯(lián)網(wǎng)、智慧都市等領(lǐng)域,也需要大量的地理位置相關(guān)操作,這些都是MongoDB的競(jìng)技場(chǎng)。
本篇文章將會(huì)以Mongodb為數(shù)據(jù)庫(kù),講述如何在數(shù)據(jù)庫(kù)層級(jí)進(jìn)行定位查詢。
舉個(gè)例子,我們需要做一個(gè)app,商家可以把自己的商品發(fā)布到app上,用戶打開(kāi)app查看離自己從近到遠(yuǎn)的商品。
如果沒(méi)有地理位置的需求,那好辦,直接插庫(kù)然后查庫(kù)就ok了,但是如果用到了地理位置,則需要用到Mongodb的一些位置功能。
Mongodb有一種地理空間索引,利用它可以進(jìn)行經(jīng)緯度的計(jì)算,下面繼續(xù)介紹如何使用該功能。
下面以Nodejs+mongoose為例
1.創(chuàng)建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.創(chuàng)建Model
let goodsModel = mongoose.model(‘Goods', goodsSchema)
3.插入數(shù)據(jù)
按照以下數(shù)據(jù)格式往數(shù)據(jù)庫(kù)插入數(shù)據(jù):
{ "name":"名字", "price":12, "location":[經(jīng)度,緯度] }
4.查看用戶附近的數(shù)據(jù)
goodsModel.find( { 'location': { $nearSphere: [ parseFloat( 經(jīng)度 ), parseFloat( 緯度 ) ], $maxDistance: 1000 } } ).limit(10).skip(0).lean().exec();
總結(jié):本次主要分享位置索引的用法,十分實(shí)用的一個(gè)功能,demo沒(méi)有做得那么手把手,但是主要的骨架是出來(lái)了,可以自由發(fā)揮謝謝啊!
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)word/pdf轉(zhuǎn)html并在線預(yù)覽
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)word、pdf文件轉(zhuǎn)html并在線預(yù)覽的功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-05-05淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類(lèi)型
這篇文章主要介紹了淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類(lèi)型,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12Java?Bean轉(zhuǎn)Map的那些踩坑實(shí)戰(zhàn)
項(xiàng)目中有時(shí)會(huì)遇到Map轉(zhuǎn)Bean,Bean轉(zhuǎn)Map的情況,下面這篇文章主要給大家介紹了關(guān)于Java?Bean轉(zhuǎn)Map那些踩坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Intellij IDEA 與maven 版本不符 Unable to import maven project See
這篇文章主要介紹了Intellij IDEA 與maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.PathTranslator was bound,本文通過(guò)圖文給大家分享解決方案,需要的朋友可以參考下2020-08-08通過(guò)Java壓縮JavaScript代碼實(shí)例分享
這篇文章主要介紹了通過(guò)Java壓縮JavaScript代碼實(shí)例分享,具有一定參考價(jià)值,需要的朋友可以了解下。2017-12-12Mybatis錯(cuò)誤引起的程序啟動(dòng)卡死問(wèn)題及解決
這篇文章主要介紹了Mybatis錯(cuò)誤引起的程序啟動(dòng)卡死問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet
這篇文章主要介紹了Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet,EnumMap即屬于一個(gè)Map,下文圍繞主題展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考參考一下2022-05-05SpringBoot結(jié)合JSR303對(duì)前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼
這篇文章主要介紹了SpringBoot結(jié)合JSR303對(duì)前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景
本文主要介紹了淺談Java中@Autowired和@Inject注解的區(qū)別和使用場(chǎng)景,@Autowired注解在依賴(lài)查找方式和注入方式上更加靈活,適用于Spring框架中的依賴(lài)注入,而@Inject注解在依賴(lài)查找方式上更加嚴(yán)格,適用于Java的依賴(lài)注入標(biāo)準(zhǔn),感興趣的可以了解一下2023-11-11