【问题标题】:MongoDB sorted geo bounding boxMongoDB 排序的地理边界框
【发布时间】:2012-04-03 16:39:51
【问题描述】:

使用 MongoDB 有一种方法可以执行边界查询(在一个框内)并从中心点对结果进行排序,并让它们通过距离计算返回..

我意识到用半径进行近距离可以为我提供一个距离有序集,但我想尝试确定它是否可能在一个盒子而不是一个圆圈内。

【问题讨论】:

    标签: mongodb geospatial


    【解决方案1】:

    很遗憾,这不可能完全按照您的描述进行。根据“地理空间索引”文档的“边界查询”部分:“[$within 查询的结果] 不按距离排序” http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries

    有几种可能的解决方法。

    1) 您可以执行 $within 查询并让您的应用程序计算从框中心返回的每个点的距离。

    2) 您可以先执行 $within 查询,将点保存在数组中,然后结合 $in [] 运行 $near 查询。

    例如,

    想象一个边界为 [0,0] 和 [8,8] 的框:

    > var box = [ [ 0, 0 ], [ 8, 8 ] ]
    

    还有几点:

    > db.points.find()
    { "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] }
    { "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] }
    { "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] }
    { "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] }
    { "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] }
    { "_id" : 6, "name" : "f", "loc" : [ 9, 4 ] }
    

    首先完成 $within 查询,并保存返回的点:

    > var c = db.points.find({loc:{$within:{"$box":box}}})
    > var boxResults = []
    > while(c.hasNext()){boxResults.push(c.next().loc)}
    

    然后将 $near 查询与 $in 查询结合起来:

    > db.points.find({loc:{$near:[4,4], $in:boxResults}})
    { "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] }
    { "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] }
    { "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] }
    { "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] }
    { "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] }
    

    上述解决方案取自 Google Groups 上提出的类似问题: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969

    希望这将允许您执行您需要执行的操作。

    【讨论】:

      【解决方案2】:

      @nick - Marc 不正确。有可能的。似乎在这里提出了类似的问题:Mongo Bounding Box Query with Limit

      秘诀是将点半径查询与边界框结合起来。您可以获得两者的所有好处(排序、距离、性能)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 2016-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        相关资源
        最近更新 更多