创建地理空间查询以查找彼此半径内的两个用户

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 对返回结果的用户数据进行比较。