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

时间:2016-04-18 18:13:12

标签: mongodb mongodb-query geospatial aggregation-framework

我正在创建一个基于用户接近度的匹配系统。基本思想是我在A点有用户A,在另一点B有用户B.两个用户都有搜索过滤器,用于确定用户进行匹配的距离。这个距离以公里为单位。 A crude depiction

无论如何,可以在单个vanilla查询中执行此操作(不使用聚合查询)?这是我到目前为止的查询

var loc = userA.location;
var rad = userA.radius;

{$near : {
        $geometry : {
            type : "Point",
            coordinates : loc
        },
        $maxDistance : rad
    }
}

我如何考虑用户的B偏好?

我打算存储一个基本上是他们偏好圈子的几何体,然后看看userA是否在那个圈子里,但这似乎不对。

1 个答案:

答案 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以返回结果。