MongoDB查询以查找圈内的所有位置

时间:2016-08-09 08:01:09

标签: mongodb

文件结构:(Facebook文件)

{
    "_id" : ObjectId("57a984222daf2339b1e06090"),
    "name" : "Arts /entertainment/nightlife",
    "location" : {
        "state" : "",
        "country" : "Nigeria",
        "latitude" : 6.45306,
        "city" : "Lagos",
        "longitude" : 3.39583,
        "street" : "no 15 petre agha street oke -afa isolo lagos",
        "zip" : "+234"
    },
    "id" : "519994548127995",
    "category" : "Arts/entertainment/nightlife",
    "category_list" : [
        {
            "name" : "Arts & Entertainment",
            "id" : "133436743388217"
        }
    ]
}

我的问题: MongoDB查询(使用$geoWithin: { $center: [ [ <x>, <y> ] , <radius> ] })查找圈内的所有地点是什么?

圈子:中心:纬度= 48.856614,经度= 2.3522219000000177。半径= 10公里。

我感谢任何可以帮助我的答案。

2 个答案:

答案 0 :(得分:3)

“notionquest”的答案帮助我找到了解决方案。但这正是我的答案:

  • 第一步:更改文档的结构,以便拥有如下位置字段:

    "location" : [x , y]` where x is the latitude, and y is the longitude.
    
  • 第二步:在位置字段上创建“2d”索引:

    db.geocircle.createIndex( { location : "2d" } );
    
  • 上一步:查询为:

    db.geocircle.find(
               { location: { $geoWithin: { $center: [ [ 48.856614,  2.3522219000000177], 0.089992801 ] } } }
    );
    

重要说明:查询中圆圈的半径以度为单位,因此我需要将10公里转换为度数。鉴于一度大约是111.12公里,我们可以做数学。

干杯!

答案 1 :(得分:0)

稍微修改地理空间数据的文档结构,如下所示。

/* 1 */
{
    "_id" : ObjectId("57a984222daf2339b1e06090"),
    "name" : "Arts /entertainment/nightlife",
    "state" : "",
    "country" : "Nigeria",
    "location" : {
        "type" : "Point",
        "coordinates" : [ 
            6.45306, 
            3.39583
        ]
    },
    "city" : "Lagos",
    "street" : "no 15 petre agha street oke -afa isolo lagos",
    "zip" : "+234",
    "id" : "519994548127995",
    "category" : "Arts/entertainment/nightlife",
    "category_list" : [ 
        {
            "name" : "Arts &amp; Entertainment",
            "id" : "133436743388217"
        }
    ]
}

在位置字段上创建&#34; 2dsphere&#34; 索引。

db.geocircle.createIndex( { location : "2dsphere" } );

然后,执行查询查询。

以下查询应找到拉各斯。

db.geocircle.find(
   { location: { $geoWithin: { $center: [ [ 6.45306, 3.39583], 10 ] } } }
);

db.geocircle.find(
   { location: { $geoWithin: { $center: [ [ 6.45310, 3.39590], 10 ] } } }
);

此查询不应该找到拉各斯。

db.geocircle.find(
   { location: { $geoWithin: { $center: [ [ 16.45310, 3.39590], 10 ] } } }
);