使用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。我怀疑其他人会偶然发现这一点,所以也许你可以更新你的问题,包括分片信息和版本号