MongoDB之索引(地理資訊索引)
地理資訊索引分為兩類:2D平面索引,2DSphere球面索引。
在2D索引裡面基本上能夠儲存到資訊就是座標,也就是經緯度座標。
範例:定義一個商鋪的集合
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集合就可以實現座標位置的查詢了。有兩種查詢方式:
● “$near”查詢:查詢距離某個點最近的座標點。
● "$geoWithin"查詢:查詢某個形狀內的點。
範例:假設現在的座標是:[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 ] }
如果執行了以上的查詢,實際上會將資料集合裡面的前100個點的資訊都返回來,可以設定距離範圍。
範例:設定查詢的距離範圍
> db.shop.find({"loc":{"$near":[30,30],"$maxDistance":20}})
{ "_id" : ObjectId("599396cd0184ff511bf02bc6"), "loc" : [ 20, 20 ] }
{ "_id" : ObjectId("599396ce0184ff511bf02bc9"), "loc" : [ 30, 50 ] }
但是需要注意一點,在2D索引裡面雖然支援最大距離,但是不支援最小距離。
但是也可以設定一個查詢的範圍,使用“$geoWithin”查詢,可以設定的範圍有:
矩形範圍($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資料庫裡面,除了一些支援的操作函式之外,還有一個重要的命令:runCommand(),這個函式可以執行特定的MongoDB命令。
範例:利用runCommand()實現資訊查詢
> 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之中最為基礎的命令。
在2D索引裡面基本上能夠儲存到資訊就是座標,也就是經緯度座標。
範例:定義一個商鋪的集合
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集合就可以實現座標位置的查詢了。有兩種查詢方式:
● “$near”查詢:查詢距離某個點最近的座標點。
● "$geoWithin"查詢:查詢某個形狀內的點。
範例:假設現在的座標是:[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 ] }
如果執行了以上的查詢,實際上會將資料集合裡面的前100個點的資訊都返回來,可以設定距離範圍。
範例:設定查詢的距離範圍
> db.shop.find({"loc":{"$near":[30,30],"$maxDistance":20}})
{ "_id" : ObjectId("599396cd0184ff511bf02bc6"), "loc" : [ 20, 20 ] }
{ "_id" : ObjectId("599396ce0184ff511bf02bc9"), "loc" : [ 30, 50 ] }
但是需要注意一點,在2D索引裡面雖然支援最大距離,但是不支援最小距離。
但是也可以設定一個查詢的範圍,使用“$geoWithin”查詢,可以設定的範圍有:
矩形範圍($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資料庫裡面,除了一些支援的操作函式之外,還有一個重要的命令:runCommand(),這個函式可以執行特定的MongoDB命令。
範例:利用runCommand()實現資訊查詢
> 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之中最為基礎的命令。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28536251/viewspace-2144105/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MongoDB之索引(全文索引)MongoDB索引
- MongoDB之索引(過期索引)MongoDB索引
- MongoDB之索引(唯一索引)MongoDB索引
- MongoDB之索引(簡介)MongoDB索引
- MongoDB 索引MongoDB索引
- mongodb索引MongoDB索引
- Elasticsearch 在地理資訊空間索引的探索和演進Elasticsearch索引
- mongodb索引使用MongoDB索引
- mongoDB的索引MongoDB索引
- MongoDB索引概述MongoDB索引
- mongodb建立索引和刪除索引和背景索引backgroundMongoDB索引
- MongoDB學習之豐富的索引MongoDB索引
- MongoDB索引,效能分析MongoDB索引
- 【索引】使用索引分析快速得到索引的基本資訊索引
- 分析索引快速獲取索引資訊索引
- mysql索引之字首索引MySql索引
- mongodb 如何檢視索引MongoDB索引
- MongoDB ( 五 )高階_索引MongoDB索引
- MongoDB索引實戰技巧MongoDB索引
- 【Mongo】MongoDB索引管理-索引的建立、檢視、刪除MongoDB索引
- 索引@oracel索引技術之索引最佳化索引
- MongoDB索引優化詳解MongoDB索引優化
- MongoDB中的定時索引MongoDB索引
- 005.MongoDB索引及聚合MongoDB索引
- MongoDB索引的簡單理解MongoDB索引
- MongoDB慢查詢與索引MongoDB索引
- MongoDB複合索引詳解MongoDB索引
- SQL優化之統計資訊和索引SQL優化索引
- 快速掌握mongoDB(三)——mongoDB的索引詳解MongoDB索引
- 淺談索引系列之索引重建索引
- MySQL索引之空間索引(SPATIAL)MySql索引
- FAQ系列|MySQL索引之聚集索引MySql索引
- 分散式文件儲存資料庫之MongoDB索引管理分散式資料庫MongoDB索引
- MongoDB學習筆記之索引用法和效率分析MongoDB筆記索引
- 一步步學MongoDB之索引操作篇MongoDB索引
- MongoDB索引與優化詳解MongoDB索引優化
- mongodb資料庫如何建立索引?MongoDB資料庫索引
- MongoDB中複合索引結構MongoDB索引