我有一个带有位置字段的文档集合。我需要在边界框内找到文档,并限制结果文档的数量(让我们说25)。但我还需要这25个文档uniformly distributed遍布边界框(不只是任何25个随机文档)。有什么办法可以用MongoDB实现这个目标吗?
答案 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
匹配实际落入框内的那些项目。