在進行雲開發的數據更新的時候,咱們能夠進行不一樣條件的查詢,從而提高咱們更新的效率。在雲開發支持了 Geo Point 等相關數據類型之後,咱們能夠用雲開發實現多種不一樣地理位置的數據存儲和利用,對於咱們開發基於地理位置的小程序來講,有很大的幫助。數據庫
今天的課程中,咱們來介紹小程序數據更新命令中的「地理位置查詢」命令。小程序
查詢特定點附近的數據能夠說是咱們在進行應用開發時,最爲經常使用的功能,它能夠應用於諸如查詢當前用戶座標周圍的店鋪、查詢距離我最近的公交站等場景,這個時候,咱們須要使用 geoNear
來進行數據庫查詢。數據結構
若是你想要使用 geoNear
,則要求你在數據庫中存儲的數據對於地理位置的存儲是基於 db.Geo.Point
進行的,這樣你就能夠完成使用 geoNear
進行查詢。spa
假設咱們當前數據庫內數據的結構是這樣的,每個數據下有一個 point 屬性,這個屬性是經過 db.Geo.Point
添加的。3d
若是咱們但願查詢距離當前位置,1000米 ~ 2000米的數據,則能夠執行這樣的命令code
const db = wx.cloud.database()
const _ = db.command
db.collection('items').where({
location: _.geoNear({
geometry: db.Geo.Point(113.323809, 23.097732),
minDistance: 1000,
maxDistance: 2000,
})
}).get()
複製代碼
這裏的 geometry
中的 Point
的數據是獲取到的當前地理位置信息,它必須是 db.Geo.Point
類型的,你能夠經過小程序的 wx.getLocation
方法獲取當前的地址信息,並將其做爲參數設置在這裏。cdn
minDistance
則是距離中心點的最小距離,單位是米,因此這裏將其設置爲 1000。相似的,maxDistance
則是距離中心點的最大距離,單位也是米,因此這裏將其設置爲 2000。對象
經過這樣的方法,咱們就能夠查詢出數據了。blog
在咱們去作一些基於地理位置的應用的時候,db.command.geoNear
能夠很大程度上簡化咱們的開發。開發
在開發地理位置應用時,除了基於某一個點的位置進行查詢之外,咱們還會查詢某一個區域內的數據,好比查詢北京市昌平區內的全部的酒吧、查詢深圳南山區內全部的博物館,這樣的需求也是切實存在,而且十分常見的需求。這個時候,咱們能夠考慮,使用 geoWithin
來進行數據查詢。
若是你想要使用 geoWithin
,則要求你在數據庫中存儲的數據對於地理位置的存儲是基於 db.Geo.Point
進行的,這樣你就能夠完成使用 geoWithin
進行查詢。
假設咱們當前數據庫內數據的結構是這樣的,每個數據下有一個 point 屬性,這個屬性是經過 db.Geo.Point
添加的。
若是咱們但願查詢在東經 112 度 ~ 東經 114 度,北緯 22 度 到 北緯 24 度範圍內的數據,則能夠執行這樣的數據查詢
const db = wx.cloud.database()
const _ = db.command
const { Point, LineString, Polygon } = db.Geo
db.collection('items').where({
location: _.geoWithin({
geometry: Polygon([
LineString([
Point(112, 22),
Point(112, 24),
Point(114, 24),
Point(114, 22),
Point(112,22)
])
]),
})
}).get()
複製代碼
咱們經過 Polygon
和 LineString
構建出了一個正方形,從而實現了查詢一個特定的正方形區域內的數據。
若是你但願查詢一個其餘形狀的範圍內的數據,只須要傳入多個 Point
的數據就能夠完成,好比若是你要查詢一個五邊形內部的數據,也只需在構建 LineString 時,傳入 6 個 Point的數據便可。
爲何五邊形倒是 6 個 Point 呢?
由於在雲開發中,若是你要構建一個多邊形,則須要使得整個多邊形是閉合的,也就是說,你的起始點是同樣的,所以,若是你想要構建一個四邊形,則須要五個點。若是是構建五邊形,則是六個點。
geoIntersects
是用於查詢全部數據中和給定數據相交的數據,咱們能夠將其用做判斷某一些特定的點、線、面是否在一個特定區域內。舉個例子,假設你已經有了用戶當前的活動範圍,好比某一條街道,那麼你能夠基於 geoIntersects
來構建一條線,並基於這條線查詢,全部數據中,是否有數據與這個線相交,若是相交,則說明對應的數據點是在用戶所在的街道上。你就能夠將這個數據告訴用戶,讓用戶去找這些點。
相比於 geoWithin
,geoIntersects
對於當前用戶的位置數據更爲隨意,支持 Point
、LineString
、MultiPoint
、 MultiLineString
、 Polygon
、 MultiPolygon
等多種不一樣的數據結構,在進行查詢的時候,更加的方便。
若是你想要使用 geoIntersects
,則要求你在數據庫中存儲的數據對於地理位置的存儲是基於 db.Geo.Point
進行的,這樣你就能夠完成使用 geoIntersects
進行查詢。
假設咱們當前數據庫內數據的結構是這樣的,每個數據下有一個 point 屬性,這個屬性是經過 db.Geo.Point
添加的。
若是咱們但願查詢在東經 112 度 ~ 東經 114 度,北緯 22 度 到 北緯 24 度範圍內的數據,則能夠執行這樣的數據查詢
const db = wx.cloud.database()
const _ = db.command
const { Point, LineString, Polygon } = db.Geo
db.collection('items').where({
location: _.geoIntersects({
geometry: Polygon([
LineString([
Point(112, 22),
Point(112, 24),
Point(114, 24),
Point(114, 22),
Point(112,22)
])
]),
})
}).get()
複製代碼
咱們經過 Polygon
和 LineString
構建出了一個正方形,從而實現了查詢一個特定的正方形區域內的數據。
若是你但願查詢一個其餘形狀的範圍內的數據,只須要傳入多個 Point
的數據就能夠完成,好比若是你要查詢一個五邊形內部的數據,也只需在構建 LineString 時,傳入 6 個 Point的數據便可。
固然,在使用時,你能夠根據本身的實際狀況,設定不一樣的圖形類型,做爲數據庫查詢的對象,完成本身的數據查詢需求。
這節課,咱們介紹了 geoNear
、geoWithin
、geoIntersects
三個 API,幫助你們理解其各自在什麼樣的場景下使用,下一節課,咱們將介紹 eq、neq、lt、lte、gt、gte 幾個命令。