MongoDB geoNear没有返回任何结果

时间:2014-10-26 00:30:50

标签: mongodb geospatial mongodb-query

我有一个地理空间集合,我试图查询给定范围内的结果。这样做时我无法弄清楚为什么我的查询返回没有信息的结果数组。我已尝试过不同的运行方式,但始终会得到相同的结果。我需要知道我做错了什么,并且找不到任何理由为什么这不应该工作。

以下是集合中文档的格式:

{
"_id" : ObjectId("54432bd85ae1e944d857659d"),
"FEATURE_ID" : 406,
"Location" : {
    "properties" : {
        "name" : "Cement Trough Canyon",
        "mapName" : "Blue House Mountain",
        "class" : "Valley",
        "state" : "AZ",
        "county" : "Navajo",
        "retrieved" : false
    },
    "geometry" : {
        "type" : "Point",
        "coordinates" : [ 
            -110.5126118, 
            33.9950482
        ]
      }
   }
}

以下是我要尝试运行的查询:

db.runCommand({
    geoNear: "gis",
    near: { type: "Point", 
    coordinates: [ -110.512612, 33.995048 ] },
    spherical: true
})

这是我为集合创建的索引:

{
"geometry" : "2dsphere"
}

结果如下:

{
"results" : [],
"stats" : {
    "nscanned" : NumberLong(26),
    "objectsLoaded" : NumberLong(26),
    "avgDistance" : NaN,
    "maxDistance" : 0,
    "time" : 4
},
    "ok" : 1
}

根据这个,查询运行正常,但它没有从集合中的对象中获取任何数据。我能解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是您将几何体作为位置的子字段,因此当您运行

db.gis.ensureIndex({"Location": "2dsphere"});

MongoDB在Location上创建索引,好像这是几何字段的名称,即使该字段不存在,也返回OK(在我看来这有点令人困惑)。为了进一步说明这个问题,试试这个:

db.gis.ensureIndex({"i_do_not_exist": "2dsphere"});

将返回类似以下内容的内容,具体取决于您已有多少索引:

{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 2,
   "numIndexesAfter" : 3,
   "ok" : 1
}

解决方案是使用点表示法来引用嵌入的几何字段,即

db.gis.ensureIndex({"Location.geometry": "2dphere"});

然后您的查询将返回结果。有关详细信息,请参阅文档中的indexes on sub documents部分。

或者,您可以重新构建文档,以便几何字段位于顶层。

db.gis.insert({
  "_id" : ObjectId("54432bd85ae1e944d857659d"),
  "FEATURE_ID" : 406,
  "Location" : {
     "properties" : {
       "name" : "Cement Trough Canyon",
       "mapName" : "Blue House Mountain",
       "class" : "Valley",
       "state" : "AZ",
       "county" : "Navajo",
       "retrieved" : false
     }
  },
  "geometry" : {
     "type" : "Point",
     "coordinates" : [ 
        -110.5126118, 
         33.9950482
     ]
   }   
});

db.gis.ensureIndex({"geometry": "2dsphere"});

db.runCommand({
   geoNear: "gis",
   near: { type: "Point", 
   coordinates: [ -110.512612, 33.995048 ] },
   spherical: true
});

现在返回上述记录。