關(guān)于mongodb的地理檢索的實(shí)現(xiàn)

使用mongoDB不是很多,記得以前做“家長(zhǎng)助手”的時(shí)候舆逃,使用過(guò)一點(diǎn)。只是在去年做“派單系統(tǒng)”的時(shí)候戳粒,又再一次使用mongoDB路狮。
在這里先簡(jiǎn)單介紹一下派單系統(tǒng),派單系統(tǒng)在云足療(O2O蔚约,上門足療)里一個(gè)專門負(fù)責(zé)訂單派送奄妨,提高訂單完成效率的一個(gè)系統(tǒng)。主要是當(dāng)一個(gè)來(lái)了之后苹祟,會(huì)根據(jù)訂單的服務(wù)項(xiàng)目砸抛、服務(wù)時(shí)間和服務(wù)地點(diǎn),快速找到最合適最優(yōu)秀的技師树枫,返回給用戶锰悼。由于上門足療特殊行業(yè)的要求,不能給訂單指定技師直接下單团赏。而是將篩選的一些優(yōu)秀的技師返回給用戶,讓用戶自己去選擇指派給哪位技師耐薯。
項(xiàng)目背景說(shuō)完了之后舔清,就是技術(shù)方案選擇的問(wèn)題。一開(kāi)始曲初,是想基于HBase一個(gè)分布式的体谒、面向列的開(kāi)源數(shù)據(jù)庫(kù)去存儲(chǔ)技師上報(bào)經(jīng)緯度。然后通過(guò)storm流式計(jì)算技師的位置臼婆。后來(lái)抒痒,感覺(jué)HBase過(guò)重而且還不便于維護(hù)。同時(shí)颁褂,又考慮到小公司的都會(huì)面對(duì)的一個(gè)問(wèn)題——成本問(wèn)題故响。就放棄了這一種方案。然后颁独,就想選擇一個(gè)非關(guān)系型數(shù)據(jù)庫(kù)去存住數(shù)據(jù)彩届,這時(shí)候就想到了Mongodb。好了誓酒,這是數(shù)據(jù)層樟蠕。分布式架構(gòu)我們使用的阿里的dubbo。選擇它的原因就不多說(shuō)了。首先是寨辩,市面上使用廣泛吧吓懈。以后,會(huì)具體講述其特點(diǎn)靡狞。分布式的管控使用的是zookeeper耻警,跨系統(tǒng)中間件使用的是ActiveMq。這個(gè)還是要簡(jiǎn)單說(shuō)一下為什么要選擇這個(gè)耍攘,而沒(méi)有選擇市面上用的比較多的RocketMq榕栏。最重要的一個(gè)原因時(shí)以前的工作中使用過(guò),而對(duì)MQ的應(yīng)用場(chǎng)景是師傅端經(jīng)緯度上報(bào)蕾各,消息的可靠性又不是很高扒磁,同時(shí)降低了學(xué)習(xí)成本。說(shuō)到這里式曲,感覺(jué)說(shuō)的太多了妨托,今天主要說(shuō)的是mongodb的應(yīng)用。
接下來(lái)就寫一個(gè)基于mongodb的地理檢索的實(shí)現(xiàn)吧吝羞!
Controller層
//查詢附近@ResponseBody@RequestMapping(value = "/geoNearN", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})public String testQueryMongoTopN() { CarPointNearQuery personQuery = new CarPointNearQuery(); Random random = new Random(); double[] arr = MongoUtil.getRandomLocation(); //最多查100條記錄 personQuery.setCount(100); //隨機(jī)1km米到10km int distance = random.nextInt(10); personQuery.setDistance(distance); personQuery.setLongitude(arr[0]); personQuery.setLatitude(arr[1]); return JSON.toJSONString(mongoLbsService.geoNearCarPoint(personQuery));}

Service層
public CarPointNearResult geoNearCarPoint(CarPointNearQuery carPointNearQuery) { CarPointNearResult carPointNearResult = new CarPointNearResult(); if(carPointNearQuery != null && carPointNearQuery.getLongitude() != 0.0D && carPointNearQuery.getLatitude() != 0.0D) { Point point = new Point(carPointNearQuery.getLongitude(), carPointNearQuery.getLatitude()); NearQuery near = NearQuery.near(point, Metrics.KILOMETERS); Query query = new Query(); //數(shù)量 query.limit(carPointNearQuery.getCount() == 0?100:carPointNearQuery.getCount()); near.query(query); //距離 near.maxDistance(new Distance(carPointNearQuery.getDistance() == 0.0D?1.0D:carPointNearQuery.getDistance(), Metrics.KILOMETERS)); near.spherical(true); //調(diào)用DAO層,獲取數(shù)據(jù) GeoResults geoResults = this.carPointDao.geoNear(near, CarPoint.class, "carPoint"); carPointNearQuery.setCount(geoResults.getContent().size()); carPointNearQuery.setDistance(near.getMaxDistance().getValue()); carPointNearResult.setCarPointNearQuery(carPointNearQuery); List geoResultsContent = geoResults.getContent(); ArrayList resultsList = new ArrayList(); Iterator i$ = geoResultsContent.iterator(); while(i$.hasNext()) { GeoResult geoResult = (GeoResult)i$.next(); CarPointResult carPointResult = new CarPointResult(); carPointResult.setDistance(geoResult.getDistance().getValue()); carPointResult.setCarPoint((CarPoint)geoResult.getContent()); resultsList.add(carPointResult); } carPointNearResult.setCarPointList(resultsList); return carPointNearResult; } else { logger.error("geoNear 參數(shù)異常"); carPointNearResult.setErrorCode(ErrorCode.PARAM_ERROR); return null; }}

DAO層
public GeoResults<T> geoNear(NearQuery near, Class<T> clazz, String collectionName) { //直接使用mongoTemplate就可以了 GeoResults geoResults = this.mongoTemplate.geoNear(near, clazz, collectionName); return geoResults;}

以上就是使用mongodbTemplate實(shí)現(xiàn)地理檢索的功能兰伤,關(guān)于mongodb地理檢索的方式有很多種,具體可以參考mongodb中文社區(qū)钧排,里面都有具體的介紹敦腔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恨溜,隨后出現(xiàn)的幾起案子符衔,更是在濱河造成了極大的恐慌,老刑警劉巖糟袁,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件判族,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡项戴,警方通過(guò)查閱死者的電腦和手機(jī)形帮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)周叮,“玉大人辩撑,你說(shuō)我怎么就攤上這事》碌ⅲ” “怎么了槐臀?”我有些...
    開(kāi)封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)氓仲。 經(jīng)常有香客問(wèn)我水慨,道長(zhǎng)得糜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任晰洒,我火速辦了婚禮朝抖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谍珊。我一直安慰自己治宣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布砌滞。 她就那樣靜靜地躺著侮邀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贝润。 梳的紋絲不亂的頭發(fā)上绊茧,一...
    開(kāi)封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音打掘,去河邊找鬼华畏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尊蚁,可吹牛的內(nèi)容都是我干的亡笑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼横朋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仑乌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起琴锭,我...
    開(kāi)封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晰甚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后祠够,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粪牲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年古瓤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腺阳。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袜蚕,到底是詐尸還是另有隱情八毯,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布焙蚓,位于F島的核電站纹冤,受9級(jí)特大地震影響洒宝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萌京,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一雁歌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧知残,春花似錦靠瞎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至制恍,卻和暖如春父能,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吧趣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工法竞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强挫。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓岔霸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親俯渤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呆细,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • NO.04 11/18/2017 大R *原創(chuàng) 大R輕言: 小女孩的夢(mèng)梨树,做著做著就醒了坑夯。 1 最近...
    貓小白_573c閱讀 323評(píng)論 0 1
  • 喧嘩的城市,霓虹交錯(cuò)抡四,麻木的神情中柜蜈,所有華美都顯得倉(cāng)促而模糊,唯有在深夜指巡,獨(dú)自望著蒼穹淑履,才能讓靈魂釋然,才能傾聽(tīng)心...
    柳塵微閱讀 266評(píng)論 2 4
  • 2017-06-15 生活中藻雪,我們會(huì)感覺(jué)一些人特別聰明:同樣是看一本書秘噪,他們能說(shuō)出的東西比別人多;同樣是解決一個(gè)問(wèn)...
    一粟于海閱讀 387評(píng)論 1 2
  • 今天最大的收獲是終于挑戰(zhàn)了拜日式A-108遍勉耀,心得是真去做了其實(shí)沒(méi)有想象中那么難指煎,不要活在思維里蹋偏,要勇敢去體驗(yàn),只...
    蔣開(kāi)心閱讀 145評(píng)論 0 0
  • 每一個(gè)優(yōu)秀的人贯要,都不是與生俱來(lái)帶著光環(huán)的暖侨,也不一定是比別人幸運(yùn)。他們只是在任何一件小事上崇渗,都對(duì)自己有所要求字逗,不因舒...
    姜月萍閱讀 128評(píng)論 0 0