简体   繁体   English

从MongoDB获取唯一的GEO数据

[英]Get unique GEO data from MongoDB

I have the following GEO data in my Mongo Data base. 我的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}})

I'm trying to get the closest "name" for given radios. 我正在尝试获取给定收音机的最接近的“名称”。

When I run the following query 当我运行以下查询

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

I get 我懂了

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 } }

But I want to retrive the unique "name" with in the radius like shown below. 但我想在半径与以检索独特的“名字”如下图所示。

> 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 } }

How can I add constraint in it? 如何在其中添加约束?

You can't add that sort of grouping constraint to your query (at least, with MongoDB 2.0.x) so you would have to iterate the results in your app code to pull out what you need. 您无法将这种分组约束添加到查询中(至少在MongoDB 2.0.x中),因此您必须在应用程序代码中迭代结果以提取所需的内容。

Have created an example below assuming that: 假设以下创建了一个示例:

  • it would be useful to keep track of the number of matches for a given name 跟踪给定名称的匹配数将很有用
  • you only want to include details of the nearest match for a given name 您只想包含给定名称的最接近匹配项的详细信息
  • MongoDB geoNear() sorts by distance so the first match should be the nearest MongoDB geoNear()按距离排序,因此第一个匹配应该是最接近的

This is using the JS shell: 这是使用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
    }
}

A common approach for this sort of search result would be to display all matches found in a list and also plot them on a map. 这种搜索结果的常见方法是显示列表中找到的所有匹配项,并将它们绘制在地图上。 Ideally your map view would support some sort of Marker Clustering to automatically group markers based on the user's selected zoom level. 理想情况下,您的地图视图将支持某种标记聚类,以根据用户选择的缩放级别自动对标记进行分组。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM