MongoDB中怎么使用地理信息索引,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司是專業(yè)的花山網(wǎng)站建設(shè)公司,花山接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行花山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!地理信息索引分為兩類:2D平面索引,2DSphere球面索引。
在2D索引里面基本上能夠保存到信息就是坐標(biāo),也就是經(jīng)緯度坐標(biāo)。
范例:定義一個商鋪的集合
db.shop.insert({loc:[10,10]});
db.shop.insert({loc:[20,10]});
db.shop.insert({loc:[10,20]});
db.shop.insert({loc:[20,20]});
db.shop.insert({loc:[100,100]});
db.shop.insert({loc:[80,30]});
db.shop.insert({loc:[30,50]});
范例:為s> db.shop.createIndex({"loc":"2d"})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}hop集合定義2D索引
這個時候shop集合就可以實現(xiàn)坐標(biāo)位置的查詢了。有兩種查詢方式:
● “$near”查詢:查詢距離某個點最近的坐標(biāo)點。
● "$geoWithin"查詢:查詢某個形狀內(nèi)的點。
范例:假設(shè)現(xiàn)在的坐標(biāo)是:[30,30]
> db.shop.find({"loc":{"$near":[30,30]}})
{ "_id" : ObjectId("599396cd0184ff511bf02bc6"), "loc" : [ 20, 20 ] }
{ "_id" : ObjectId("599396ce0184ff511bf02bc9"), "loc" : [ 30, 50 ] }
{ "_id" : ObjectId("599396cd0184ff511bf02bc4"), "loc" : [ 20, 10 ] }
{ "_id" : ObjectId("599396cd0184ff511bf02bc5"), "loc" : [ 10, 20 ] }
{ "_id" : ObjectId("599396cd0184ff511bf02bc3"), "loc" : [ 10, 10 ] }
{ "_id" : ObjectId("599396cd0184ff511bf02bc8"), "loc" : [ 80, 30 ] }
{ "_id" : ObjectId("599396cd0184ff511bf02bc7"), "loc" : [ 100, 100 ] }
如果執(zhí)行了以上的查詢,實際上會將數(shù)據(jù)集合里面的前100個點的信息都返回來,可以設(shè)置距離范圍。
范例:設(shè)置查詢的距離范圍
> db.shop.find({"loc":{"$near":[30,30],"$maxDistance":20}})
{ "_id" : ObjectId("599396cd0184ff511bf02bc6"), "loc" : [ 20, 20 ] }
{ "_id" : ObjectId("599396ce0184ff511bf02bc9"), "loc" : [ 30, 50 ] }
但是需要注意一點,在2D索引里面雖然支持大距離,但是不支持最小距離。
但是也可以設(shè)置一個查詢的范圍,使用“$geoWithin”查詢,可以設(shè)置的范圍有:
矩形范圍($box):{"$box":[[x1,y1],[x2,y2]]}
圓形范圍($center):{"$center":[[x1,y1],r]}
多邊形($polygon):{"$polygon":[[x1,y1],[x2,y2],[x3,y3],...]}
范例:查詢矩形范圍
> db.shop.find({"loc":{"$geoWithin":{$box:[[30,30],[80,80]]}}})
{ "_id" : ObjectId("599396ce0184ff511bf02bc9"), "loc" : [ 30, 50 ] }
{ "_id" : ObjectId("599396cd0184ff511bf02bc8"), "loc" : [ 80, 30 ] }
范例:查詢圓形范圍
> db.shop.find({"loc":{"$geoWithin":{$center:[[30,30],20]}}})
{ "_id" : ObjectId("599396cd0184ff511bf02bc6"), "loc" : [ 20, 20 ] }
{ "_id" : ObjectId("599396ce0184ff511bf02bc9"), "loc" : [ 30, 50 ] }
在MongoDB數(shù)據(jù)庫里面,除了一些支持的操作函數(shù)之外,還有一個重要的命令:runCommand(),這個函數(shù)可以執(zhí)行特定的MongoDB命令。
范例:利用runCommand()實現(xiàn)信息查詢
> db.runCommand({"geoNear":"shop","near":[30,30],"maxDistance":20,num:2})
{
"results" : [
{
"dis" : 14.142135623730951,
"obj" : {
"_id" : ObjectId("599396cd0184ff511bf02bc6"),
"loc" : [
20,
20
]
}
},
{
"dis" : 20,
"obj" : {
"_id" : ObjectId("599396ce0184ff511bf02bc9"),
"loc" : [
30,
50
]
}
}
],
"stats" : {
"nscanned" : 4,
"objectsLoaded" : 2,
"avgDistance" : 17.071067811865476,
"maxDistance" : 20,
"time" : 0
},
"ok" : 1
}
這類的命令可以說是MongoDB之中最為基礎(chǔ)的命令。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。