我正在创建一个基于用户接近度的匹配系统。基本思想是我在A点有用户A,在另一点B有用户B.两个用户都有搜索过滤器,用于确定用户进行匹配的距离。这个距离以公里为单位。
无论如何,可以在单个vanilla查询中执行此操作(不使用聚合查询)?这是我到目前为止的查询
var loc = userA.location;
var rad = userA.radius;
{$near : {
$geometry : {
type : "Point",
coordinates : loc
},
$maxDistance : rad
}
}
我如何考虑用户的B偏好?
我打算存储一个基本上是他们偏好圈子的几何体,然后看看userA是否在那个圈子里,但这似乎不对。
答案 0 :(得分:3)
您已经在每个用户上存储了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"
的附加属性,表示找到的& #39;用户&#39 ;.当索引为"spherical"
时,"2dsphere"
选项是必需的。
作为聚合"管道",这允许另一个操作作用于输出。 $redact
阶段进行"逻辑比较"现有"radius"
数据和生成的"distance"
字段,以查看该距离是否小于"存储的半径数据。
仅当条件为true
时,才会通过$$KEEP
返回文档,否则距离会大于用户半径,因为文档已通过$$PRUNE
从结果中删除。
您是如何进行比较,尊重用户数据radius
以返回结果。