MongoDB實現附近的人

MongoDB實現附近的人

最近騰訊把「漂流瓶」這個張小龍引覺得傲的產品下架,正所謂:匹夫無罪懷璧其罪,漂流瓶本無罪,可是被一些人利用傳播色情內容或廣告,所以在11月30號深夜,騰訊關閉漂流瓶。那麼做爲微信另外的一個你們熟悉的功能「附近的人」會不會被下架呢?今天咱們暫不討論,我們今天討論的是附近的人怎麼實現,固然實現的方式有不少種:好比Redis,MySQL,Postgresql,MongoDB,全文檢索框架等。那今天我就使用MongoDB的LBS功能實現附近的人!sql

img

1、MongoDB簡介

MongoDB是一種NoSql數據庫,是一個使用C++開發的高性能、開源,無模式的文檔型數據庫。MongoDB是面向文檔的,文檔以JSON格式,二進制JSON (BSON) 存儲在MongoDB中。官方網站地址是:https://www.mongodb.com/ 。主要特色有:高性能、高可用、水平擴展能力強。支持徹底索引,查詢,支持服務器之間的數據複製和故障恢復。支持C++,Ruby,Java,Python,PHP,C,C#,Javascript,Perl等。mongodb

mongodb

2、MongoDB與關係型數據庫比較

關係型數據庫概念 MongoDB概念 說明
database database 數據庫
table collection 數據庫表/集合
row document 數據記錄行/文檔
column field 數據字段/域
index index 索引

對比

3、準備工做

下載並安裝mongodb數據庫,下載並安裝Robomongo,若有不知能夠諮詢小編!數據庫

4、數據準備

往數據庫中批量插入數據,use mage切換到mage數據庫,執行db.user.insertMany(),user是文檔名,insertMany()是批量插入命令,裏面傳入json數組,{'name':'楊帥哥', 'address':'江西省南昌市青山湖區市場和質量監督管理局', 'gender':1, loc:[115.993121,28.676436]}表明一條用戶數據,其中gender:0表明女1,表明男,loc是一個經緯度的數組,固然也能夠是loc : { lng : 115.993067 , lat : 28.67606 },但官方推薦數組。json

db.user.insertMany([
 {'name':'楊帥哥', 'address':'江西省南昌市青山湖區市場和質量監督管理局', 'gender':1, loc:[115.993121,28.676436]},
 {'name':'王美眉', 'address':'江西省南昌市青山湖區創新一路職位小廚', 'gender':0, loc:[116.000093,28.679402]},
 {'name':'張美眉', 'address':'江西省南昌市青山湖區紫陽大道1916號', 'gender':0, loc:[115.999967,28.679743]},
 {'name':'李美眉', 'address':'江西省南昌市青山湖區雲中城', 'gender':0, loc:[115.995593,28.681632]},
 {'name':'彭美眉', 'address':'江西省南昌市青山湖區北京東路1666號', 'gender':0, loc:[115.975543,28.679509]},
 {'name':'趙美眉', 'address':'江西省南昌市青山湖區市場一路大潤發', 'gender':0, loc:[115.968428,28.669368]},
 {'name':'廖美眉', 'address':'江西省南昌市南昌縣奧林匹克中心', 'gender':0, loc:[116.035262,28.677037]},
 {'name':'餘帥哥', 'address':'江西省南昌市南昌縣科技學院瑤湖校區', 'gender':1, loc:[116.02477,28.68667]},
 {'name':'吳帥哥', 'address':'江西省南昌市青山湖區創新一路母嬰店', 'gender':1, loc:[116.002384,28.683865]},
 {'name':'何帥哥', 'address':'江西省南昌市青山湖區紫陽大道2999號', 'gender':1, loc:[116.000821,28.68129]},
])

5、設置2d索引

由於我以二維平面上點的方式存儲的數據,想要進行LBS查詢,那麼要設置2d索引。db.user.createIndex({'loc':"2d"})其中loc是索引的字段。數組

1544063583665

6、查詢附近200米的人

查詢附近的人,首先的指導當前用戶所在的經緯度,若是不只想要獲得數據還要獲得距離,那麼可使用$geoNear指令,若是距離本身去計算可使用$near或者$geoWithin而後在手動計算距離。此處採用$geoNear指令查詢附近2000m的人。服務器

db.user.aggregate({
    $geoNear:{
        near: [115.999567,28.681813], // 當前座標
        spherical: true, // 計算球面距離
        distanceMultiplier: 6378137, // 地球半徑,單位是米,那麼的除的記錄也是米
        maxDistance: 2000/6378137, // 過濾條件2000米內,須要弧度
        distanceField: "distance" // 距離字段別名
    }
})

1544069832658

到這兒爲止,採用mongodb的2d平面索引就能完成附近的好友搜索了,若是想要了解更多,歡迎來撩小編!微信

相關文章
相關標籤/搜索