我正在创建一个基于用户邻近度的匹配系统。基本思想是用户 A 在 A 点,用户 B 在另一个 B 点。两个用户都有搜索过滤器,用于确定用户可以进行匹配的距离。该距离以公里为单位。
无论如何,是否可以在单个普通查询中执行此操作(不使用聚合查询)?这是我到目前为止的查询
var loc = userA.location;
var rad = userA.radius;
{$near : {
$geometry : {
type : "Point",
coordinates : loc
},
$maxDistance : rad
}
}
我如何考虑用户的 B 偏好?
我打算存储一个基本上是他们的偏好圈的几何图形,然后查看 userA 是否在该圈内,但这似乎不对。
最佳答案
您已经为每个用户存储了 radius
属性,因此这是一件好事,不仅对于 $maxDistance
选项,而且还可以作为检查查看用户之间的距离是否“小于”radius
属性。
您现在基本上需要的是一种“查看”距离并“比较”的方法。为此,您可以使用聚合框架和 $geoNear
:
db.users.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": userA.location
},
"spherical": true,
"maxDistance": userA.radius,
"distanceField": "distance"
}},
{ "$redact": {
"$cond": {
"if": { "$lt": [ "$distance", "$radius" ] },
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
因此,它会执行相同类型的 $near
结果以及 "maxDistance"
约束,但实际上会在指定的 中返回一个附加属性“distanceField”
表示找到的“用户”之间的实际距离。当索引为“2dsphere”
时,需要“spherical”
选项。
作为聚合“管道”,这允许另一个操作对输出进行操作。 $redact
阶段对现有的“radius”数据和生成的“distance”字段进行“逻辑比较”,以查看该距离是否“小于”存储的半径数据.
只有当条件为true
时,文档才会通过$$KEEP
返回,否则距离大于用户半径,因为文档会通过$$PRUNE
.
这就是您如何根据用户数据的半径
进行比较以返回结果。
关于mongodb - 创建地理空间查询以查找彼此半径内的两个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36701378/