我正在尝试通过mongodb查询实现以下行为:
location
和该字段上2dshere的地理空间索引maxdistance
user.gps
中作为GeoJSON点可用查询当前如下所示:
query["location"] = {
$nearSphere: {
$geometry: user.gps,
$maxDistance: filterDistance
}
};
此查询成功选择了相对于用户的给定filterDistance
中的所有数据集。
我现在想要的是“如果document.maxdistance
字段> 0并且到用户的距离大于document.maxdistance
”,请不要选择数据集。
因此,如果用户居住的距离大于保存在文档中的给定距离,则我找不到该文档。
我不知道在mongodb查询中表达这一点很热,我找不到这种查询的任何示例。
答案 0 :(得分:1)
$ near / $ nearSphere不支持每个文档的距离。仅每个查询。主要原因是按距离排序。如果只需要过滤,则可以使用$ geoIntersects / $ geoWithin,但是您需要更改文档以包含覆盖区域的多边形,例如围绕其位置的圆圈Pi*2*distance
。
示例:
假设您有一个文档:
{
loc: { type: "Point", coordinates: [ 10, 20 ] },
distance: 10
}
这样,当用户的坐标位于半径之内时,例如,返回它。 [12, 25]
,并且当用户的坐标位于外部时(例如, [12,30]
。
为此,应更新文档以将loc/distance
对转换为多边形。为了简单起见,我将使用八边形,但您可能需要增加顶点数量以获得更准确的结果:
{
loc: { type: "Point", coordinates: [ 10, 20 ] },
distance: 10,
area: {
type : "Polygon",
coordinates : [[
[ 17, 27 ],
[ 10, 30 ],
[ 3, 27 ],
[ 0, 20 ],
[ 3, 13 ],
[ 10, 10 ],
[ 17, 13 ],
[ 20, 20 ],
[ 17, 27 ]
]]
}
}
然后您可以使用$geoIntersects查找包含用户坐标的区域的文档:
db.collection.find({
area: {
$geoIntersects: {
$geometry: { type: "Point" , coordinates: [ 12, 25] }
}
}
})