如何在地理边界框中找到25个均匀分布的文档?

时间:2015-06-10 07:25:22

标签: mongodb geospatial

我有一个带有位置字段的文档集合。我需要在边界框内找到文档,并限制结果文档的数量(让我们说25)。但我还需要这25个文档uniformly distributed遍布边界框(不只是任何25个随机文档)。有什么办法可以用MongoDB实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

通过一些数学和思考,你可以得到最近的"物品到盒子的中心。在聚合框架的帮助下,它需要初始查询中的一些操作。

让我们假设一个原点(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。