簡體   English   中英

從MongoDB獲取唯一的GEO數據

[英]Get unique GEO data from MongoDB

我的Mongo數據庫中有以下GEO數據。

db.car.ensureIndex({"loc":"2d" , "name" :1})

db.car.save({ "name":"Toyota car", "affiliation":"Toyota", "loc":{"lon":55.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Honda car", "affiliation":"Honda", "loc":{"lon":58.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Skoda", "affiliation":"Skoda", "loc":{"lon":52.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Ford", "affiliation":"Ford", "loc":{"lon":45.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Audi SUV", "affiliation":"Audi", "loc":{"lon":35.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Benz", "affiliation":"Benz", "loc":{"lon":75.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Skoda", "affiliation":"Skoda", "loc":{"lon":50.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Benz", "affiliation":"Skoda", "loc":{"lon":51.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Skoda SUV", "affiliation":"Skoda", "loc":{"lon":50.93939251390387,"lat":-113.999}})
    db.car.save({"name":"Honda", "affiliation":"Skoda", "loc":{"lon":55.93939251390387,"lat":-113.999}})

我正在嘗試獲取給定收音機的最接近的“名稱”。

當我運行以下查詢

db.car.find({"loc" : {"$within" : {"$center" : [[50.93939251390,-114],5]}}})

我懂了

enter code here

> db.car.find({"loc" : {"$within" : {"$center" : [[50.93939251390,-114],5]}}})
{ "_id" : ObjectId("501cc07eebb626e104d5a23b"), "name" : "Skoda", "affiliation" : "Skoda", "loc" : { "lon" : 50.93939251390387, "lat" : -113.999 } }
{ "_id" : ObjectId("501cc07eebb626e104d5a237"), "name" : "Skoda", "affiliation" : "Skoda", "loc" : { "lon" : 52.93939251390387, "lat" : -113.999 } }
{ "_id" : ObjectId("501cc07eebb626e104d5a23c"), "name" : "Benz", "affiliation" : "Skoda", "loc" : { "lon" : 51.93939251390387, "lat" : -113.999 } }
{ "_id" : ObjectId("501cc07febb626e104d5a23d"), "name" : "Skoda SUV", "affiliation" : "Skoda", "loc" : { "lon" : 50.93939251390387, "lat" : -113.999 } }

但我想在半徑與以檢索獨特的“名字”如下圖所示。

> db.car.find({"loc" : {"$within" : {"$center" : [[50.93939251390,-114],5]}}})
{ "_id" : ObjectId("501cc07eebb626e104d5a23b"), "name" : "Skoda", "affiliation" : "Skoda", "loc" : { "lon" : 50.93939251390387, "lat" : -113.999 } }
{ "_id" : ObjectId("501cc07eebb626e104d5a23c"), "name" : "Benz", "affiliation" : "Skoda", "loc" : { "lon" : 51.93939251390387, "lat" : -113.999 } }
{ "_id" : ObjectId("501cc07febb626e104d5a23d"), "name" : "Skoda SUV", "affiliation" : "Skoda", "loc" : { "lon" : 50.93939251390387, "lat" : -113.999 } }

如何在其中添加約束?

您無法將這種分組約束添加到查詢中(至少在MongoDB 2.0.x中),因此您必須在應用程序代碼中迭代結果以提取所需的內容。

假設以下創建了一個示例:

  • 跟蹤給定名稱的匹配數將很有用
  • 您只想包含給定名稱的最接近匹配項的詳細信息
  • MongoDB geoNear()按距離排序,因此第一個匹配應該是最接近的

這是使用JS Shell:

// Hash to save results
> var cars = {}

// Find closest cars to given geo point using geoNear
>   db.runCommand(
        { geoNear: 'car', near : [50.93939251390,-114], num:5}
    ).results.forEach(
        function(doc) {
            if (cars[doc.obj.name]) {
                // Increment number of matches for this name
                cars[doc.obj.name]['matches'] = cars[doc.obj.name]['matches'] + 1;
            } else {
                // Closest match found
                doc.obj['matches'] = 1;
                doc.obj['distance'] = doc.dis;
                cars[doc.obj.name] = doc.obj;
            }
        }
    )

// Check the results
> cars
{
    "Skoda" : {
        "_id" : ObjectId("501d108c9d2b5b2b5443712d"),
        "name" : "Skoda",
        "affiliation" : "Skoda",
        "loc" : {
            "lon" : 50.93939251390387,
            "lat" : -113.999
        },
        "matches" : 2,
        "distance" : 0.0010000000000047748
    },
    "Skoda SUV" : {
        "_id" : ObjectId("501d108c9d2b5b2b5443712f"),
        "name" : "Skoda SUV",
        "affiliation" : "Skoda",
        "loc" : {
            "lon" : 50.93939251390387,
            "lat" : -113.999
        },
        "matches" : 1,
        "distance" : 0.0010000000000047748
    },
    "Benz" : {
        "_id" : ObjectId("501d108c9d2b5b2b5443712e"),
        "name" : "Benz",
        "affiliation" : "Skoda",
        "loc" : {
            "lon" : 51.93939251390387,
            "lat" : -113.999
        },
        "matches" : 1,
        "distance" : 1.0000005000037404
    },
    "Ford" : {
        "_id" : ObjectId("501d108c9d2b5b2b5443712a"),
        "name" : "Ford",
        "affiliation" : "Ford",
        "loc" : {
            "lon" : 45.93939251390387,
            "lat" : -113.999
        },
        "matches" : 1,
        "distance" : 5.000000099996134
    }
}

這種搜索結果的常見方法是顯示列表中找到的所有匹配項,並將它們繪制在地圖上。 理想情況下,您的地圖視圖將支持某種標記聚類,以根據用戶選擇的縮放級別自動對標記進行分組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM