【问题标题】:How to find 25 uniformly distributed documents in a geo bounding box?如何在地理边界框中找到 25 个均匀分布的文档?
【发布时间】:2015-08-25 07:35:12
【问题描述】:

我有一组带有位置字段的文档。我需要在边界框中查找文档,并限制结果文档的数量(比如说 25 个)。但我还需要这 25 个文档是 uniformly distributed 遍布边界框(不仅仅是任何 25 个随机文档)。有什么方法可以用 MongoDB 实现这一点?

【问题讨论】:

  • 我认为您需要更清楚地定义什么是在ℝ²上的均匀分布(尤其是当您在这里使用球坐标时)。和disk point picking/sphere point picking有关系吗?
  • 上述问题你得到解决方案了吗?

标签: mongodb geospatial


【解决方案1】:

通过一些数学和思考,您可以将“最近”的项目放在盒子的中心。在聚合框架的帮助下,它需要从初始查询中执行一些操作。

让我们假设一个原点 (0,0) 的盒子和 (4,4) 的最大边缘,这使得中心 (2,2)。然后你会发出以下:

db.collection.aggregate([
    // Find results near to the centre of the box
    { "$geoNear": {
        "near": {
            "type": "Point",
            "geometry": [2,2]
        },
        "maxDistance": 4,        // limit a bit outside the boundary
        "distanceField": "dist"  // Projected field with distance
    }},

    // Filter out results outside the box
    { "$match": {
        "$geoWithin": {
            "box": [
                [0,0],
                [4,4]
            ]
        }
    }},

    // Sort by distance
    { "$sort": { "dist": 1 } }

    // Limit the results
    { "$limit": 25 }
])

这就是基本原则。请注意实际考虑您使用的坐标系以及数据是以旧格式还是 GeoJSON 格式存储的,因为这会影响记录中的投影距离。

但基本上$geoNear 会找到落在“接近”您稍后描述的框中心的特征。最重要的是,它“投影”了一个表示与查询点的“距离”的字段。然后$geoWithin 匹配那些实际落在盒子内的项目。

剩下的就是先到$sort到最近的条目,然后是$limit,从最近的条目开始到最多25个。

【讨论】:

  • 这不会返回 "uniformly distributed 文档"。还是我错过了什么?
  • @SylvainLeroux 取决于您对如何操作的定义。当然,这里的$geoNear 将返回您与中心的“距离”,而 that 是重要部分,然后在边界框内进行过滤。然后,如何根据您想要做的任何定义确定保留哪些剩余文档取决于您。所以这些是答案的重要部分。如果您想要与中心“相同”的“距离”,那么如果前两个步骤,您将不得不在外面过滤结果。这似乎是你所缺少的。
  • 我同意均匀分布的随机文档的选择应该在应用程序级别完成。我在这里不明白的一件事是$sort$limit 步骤的使用。这些只会使文档靠近边界框的中心。我认为这是一个相当有偏见的集合。
  • @SylvainLeroux 答案的开头几行对此进行了解释。聚合框架是唯一“链接”两个所需查询(已经强调为重点)的方法,但在其他方面缺乏对进一步结果的任何进一步数学分析或“比较”另一个。所以我专注于可以做的事情,而不是不能做的事情。
  • @SylvainLeroux,同意了。如果我们必须在应用程序级别进行此计算,那么执行“$sort”和“$limit”步骤是没有意义的(这样我们将获得最接近中心的点)。在应用级别进行此计算的问题是性能(db 可以返回大量文档)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多