我有一个地理空间集合,我试图查询给定范围内的结果。这样做时我无法弄清楚为什么我的查询返回没有信息的结果数组。我已尝试过不同的运行方式,但始终会得到相同的结果。我需要知道我做错了什么,并且找不到任何理由为什么这不应该工作。
以下是集合中文档的格式:
{
"_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
}
根据这个,查询运行正常,但它没有从集合中的对象中获取任何数据。我能解决这个问题吗?
谢谢!
答案 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
});
现在返回上述记录。