[英]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中),因此您必須在應用程序代碼中迭代結果以提取所需的內容。
假設以下創建了一個示例:
這是使用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.