MongoDB之索引(地理資訊索引)

stonebox1122發表於2017-08-24
地理資訊索引分為兩類: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之中最為基礎的命令。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28536251/viewspace-2144105/,如需轉載,請註明出處,否則將追究法律責任。

相關文章