使用find()进行MongoDB地理空间查询
我有一些文档的使用find()进行MongoDB地理空间查询,mongodb,geospatial,Mongodb,Geospatial,我有一些文档的“loc”字段如下所示: mongos> db.foo.findOne() { // ... some other stuff "loc" : { "type" : "Point", "coordinates" : [ -83.362342, 26.687779 ] } } 它的索引是这样的: mon
“loc”
字段如下所示:
mongos> db.foo.findOne()
{
// ... some other stuff
"loc" : {
"type" : "Point",
"coordinates" : [
-83.362342,
26.687779
]
}
}
它的索引是这样的:
mongos> db.foo.getIndices()
[
// ... some other stuff
{
"v" : 1,
"key" : {
"loc" : "2dsphere"
},
"name" : "loc_2dsphere",
"ns" : "amitest.foo",
"2dsphereIndexVersion" : 2
},
]
根据,我应该能够像下面这样查询它,但我得到的错误如下所示:
mongos> db.foo.find(
{loc :
{$near:
{$geometry:
{type: "Point",
coordinates: [-83.362342, 26.687779]
},
$maxDistance: 100
}
}
}
).limit(5)
error: { "$err" : "use geoNear command rather than $near query", "code" : 13501 }
我可以使用runCommand()
成功地查询字段,但这并不理想,因为我无法将其与其他条件结合使用:
mongos> db.runCommand(
{geoNear : "foo",
near : {type : "Point",
coordinates : [-83.362342, 26.687779]
},
spherical : true,
maxDistance : 10,
limit : 5
}
)
我有MongoDB 2.6.0,在一个包含8个碎片的散列切分集合上。在中,它指出:“对于切分集合,不支持使用$near的查询。您可以改为使用geoNear命令或$geoNear聚合阶段。”
有一个与此相关的bug,它被标记为已关闭,目标是MongoDB的未来版本1.7.2,该版本将使$near操作符能够用于分片集合。然而,请注意,有一个大问题,那就是near查询将通过mongos路由到所有碎片,这可能是非常低效的。这是因为一般来说,geo列上不支持分片,请参阅相关的仍然打开的bug
这反过来又与MongoDB使用Geohash将二维地理对象转换为既可以使用B树进行索引,又可以在理论上用作切分键的对象有关。这是一个很难解决的问题,就像geohash索引一样,对象非常接近,最终的散列值可能相隔很远,因此很难设计既适合用作切分键,又支持高效地理空间查询(如$near)的内容。有关GeoHash可能出现的问题的更多信息,请参阅中的限制部分。在中,它指出:“对于分片集合,不支持使用$near的查询。您可以改为使用geoNear命令或$geoNear聚合阶段。”
有一个与此相关的bug,它被标记为已关闭,目标是MongoDB的未来版本1.7.2,该版本将使$near操作符能够用于分片集合。然而,请注意,有一个大问题,那就是near查询将通过mongos路由到所有碎片,这可能是非常低效的。这是因为一般来说,geo列上不支持分片,请参阅相关的仍然打开的bug
这反过来又与MongoDB使用Geohash将二维地理对象转换为既可以使用B树进行索引,又可以在理论上用作切分键的对象有关。这是一个很难解决的问题,就像geohash索引一样,对象非常接近,最终的散列值可能相隔很远,因此很难设计既适合用作切分键,又支持高效地理空间查询(如$near)的内容。有关GeoHash可能出现的问题的更多信息,请参阅中的限制部分。在中,它指出:“对于分片集合,不支持使用$near的查询。您可以改为使用geoNear命令或$geoNear聚合阶段。”
有一个与此相关的bug,它被标记为已关闭,目标是MongoDB的未来版本1.7.2,该版本将使$near操作符能够用于分片集合。然而,请注意,有一个大问题,那就是near查询将通过mongos路由到所有碎片,这可能是非常低效的。这是因为一般来说,geo列上不支持分片,请参阅相关的仍然打开的bug
这反过来又与MongoDB使用Geohash将二维地理对象转换为既可以使用B树进行索引,又可以在理论上用作切分键的对象有关。这是一个很难解决的问题,就像geohash索引一样,对象非常接近,最终的散列值可能相隔很远,因此很难设计既适合用作切分键,又支持高效地理空间查询(如$near)的内容。有关GeoHash可能出现的问题的更多信息,请参阅中的限制部分。在中,它指出:“对于分片集合,不支持使用$near的查询。您可以改为使用geoNear命令或$geoNear聚合阶段。”
有一个与此相关的bug,它被标记为已关闭,目标是MongoDB的未来版本1.7.2,该版本将使$near操作符能够用于分片集合。然而,请注意,有一个大问题,那就是near查询将通过mongos路由到所有碎片,这可能是非常低效的。这是因为一般来说,geo列上不支持分片,请参阅相关的仍然打开的bug
这反过来又与MongoDB使用Geohash将二维地理对象转换为既可以使用B树进行索引,又可以在理论上用作切分键的对象有关。这是一个很难解决的问题,就像geohash索引一样,对象非常接近,最终的散列值可能相隔很远,因此很难设计既适合用作切分键,又支持高效地理空间查询(如$near)的内容。有关geohashing潜在问题的更多信息,请参阅中的限制部分。您的收藏是否已分片?如果是这样,我想我有答案,否则,别理我。在mongos中重写near查询以使用RUNCOMAND和geoNear,这是一个问题。是的,我们被切分了。这可能就是问题所在——我会恳请他们注意,在文档中&让错误消息提到切分。我已经给出了一个答案,并提供了相应文档的链接、错误报告以及我自己对切分和近切分在基于geohash的索引中有问题的原因的看法,如MongoDB。我怀疑其他人会偶然发现这一点,所以也许你可以更新你的问题,包括分片信息和版本号