创建地理空间查询以查找彼此半径内的两个用户
Creating a geospatial query to find two users within each other's radius
我正在创建一个基于用户邻近度的匹配系统。基本思想是我在 A 点有用户 A,在另一个 B 点有用户 B。两个用户都有搜索过滤器,用于确定用户可以进行匹配的距离。此距离以公里为单位。
无论如何,是否可以在单个原始查询中执行此操作(不使用聚合查询)?这是我到目前为止的查询
var loc = userA.location;
var rad = userA.radius;
{$near : {
$geometry : {
type : "Point",
coordinates : loc
},
$maxDistance : rad
}
}
我如何考虑用户的 B 偏好?
我打算存储一个基本上是他们偏好圈的几何形状,然后查看用户 A 是否在该圈内,但这似乎不对。
您已经为每个用户存储了 radius
属性,所以这是一件好事,不仅对于 $maxDistance
选项,而且还可以作为检查查看如果用户之间的距离是 "less than" radius
属性。
你现在基本上需要的是"see"那个距离和"compare"的方法。为此,您使用聚合框架和 $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"
约束,但实际上 returns 命名 [=] 中的附加 属性 17=]代表实际找到的距离'users'。当索引为 "2dsphere"
.
时,需要 "spherical"
选项
作为聚合"pipeline",这允许另一个操作作用于输出。 $redact
阶段对现有 "radius"
数据和生成的 "distance"
字段进行 "logical comparison",以查看该距离是否为 "less than" 存储的半径数据。
只有当条件为 true
时,文档才会通过 $$KEEP
返回,否则距离大于用户半径,因为文档会通过 $$PRUNE
从结果中删除。
这就是您如何根据 radius
对返回结果的用户数据进行比较。
我正在创建一个基于用户邻近度的匹配系统。基本思想是我在 A 点有用户 A,在另一个 B 点有用户 B。两个用户都有搜索过滤器,用于确定用户可以进行匹配的距离。此距离以公里为单位。
无论如何,是否可以在单个原始查询中执行此操作(不使用聚合查询)?这是我到目前为止的查询
var loc = userA.location;
var rad = userA.radius;
{$near : {
$geometry : {
type : "Point",
coordinates : loc
},
$maxDistance : rad
}
}
我如何考虑用户的 B 偏好?
我打算存储一个基本上是他们偏好圈的几何形状,然后查看用户 A 是否在该圈内,但这似乎不对。
您已经为每个用户存储了 radius
属性,所以这是一件好事,不仅对于 $maxDistance
选项,而且还可以作为检查查看如果用户之间的距离是 "less than" radius
属性。
你现在基本上需要的是"see"那个距离和"compare"的方法。为此,您使用聚合框架和 $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"
约束,但实际上 returns 命名 [=] 中的附加 属性 17=]代表实际找到的距离'users'。当索引为 "2dsphere"
.
"spherical"
选项
作为聚合"pipeline",这允许另一个操作作用于输出。 $redact
阶段对现有 "radius"
数据和生成的 "distance"
字段进行 "logical comparison",以查看该距离是否为 "less than" 存储的半径数据。
只有当条件为 true
时,文档才会通过 $$KEEP
返回,否则距离大于用户半径,因为文档会通过 $$PRUNE
从结果中删除。
这就是您如何根据 radius
对返回结果的用户数据进行比较。