MongoDB 2d $接近查询问题

时间:2016-02-03 09:58:12

标签: mongodb geospatial

我使用几个文档创建了一个虚拟集合位置

{
  "_id": ObjectId("56b1c6c32798710b058b4568"),
  "title": "place1",
  "coords": {
    "lng": -77.0057694,
    "lat": 38.8844788
  }
}

{
  "_id": ObjectId("56b1c8032798710c058b4567"),
  "title": "place2",
  "coords": {
    "lng": -77.042787,
    "lat": 38.926703
  }
}

“coords”字段有一个 2d 索引:

/** locations indexes **/
db.getCollection("locations").ensureIndex({
  "coords": "2d"
},[

]);

以下查询返回0结果,但我希望它返回两个文档:

{
  "coords": {
    "$near": {
      "lng": -77.023362,
      "lat": 38.901002
    },
    "$maxDistance": 0.002
  }
}

两个文件中各点之间的距离约为6公里,而查询中的点位于其中间,$ maxDistance约为13公里(13 / 6391~ = 0.002弧度)

为什么它不起作用的任何想法?

MongoDB v.3.0.1

1 个答案:

答案 0 :(得分:4)

我注意到您的收藏文件不符合地理空间索引和查询的legacy formatGeoJSON format

使用地理空间数据构建集合时,请确保不要混合使用两种不同的格式。我建议使用GeoJSON格式继续前进:

{ "title" : "place1",
    "coords" : { 
        "type" : "Point", 
        "coordinates" : [ -77.0057694, 38.8844788 ] 
               } 
}

{ "title" : "place2", 
    "coords" : {
        "type" : "Point",
        "coordinates" : [ -77.042787, 38.926703 ] 
               }
}

创建集合后,我们需要在坐标上创建2dsphere index

db.yourCollection.createIndex({coords:"2dsphere"})

使用创建的集合和索引,我们现在必须使用$nearSphere查询数据集:

db.yourCollection.find({ "coords": { $nearSphere:[-77.023362,38.901002],$maxDistance: 0.002 } })

当我在我的机器上运行上述场景时,这是我得到的输出:

db.yourCollection.find({ "coords": { $nearSphere:[-77.023362,38.901002],$maxDistance: 0.002  } })

{ "_id" : ObjectId("56bd1153439b16ea3a0847ed"), "title" : "place1", "coords" : { "type" : "Point", "coordinates" : [ -77.0057694, 38.8844788 ] } }
{ "_id" : ObjectId("56bd1249439b16ea3a0847ee"), "title" : "place2", "coords" : { "type" : "Point", "coordinates" : [ -77.042787, 38.926703 ] } }

最后,请确保使用MongoDB的最新稳定版本来修复错误和一般增强功能。目前,对于v3.0,它是v3.0.9,对于v3.2,它是v3.2.1