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

标签 mongodb mongodb-query geospatial aggregation-framework

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

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

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/

相关文章:

MongoDB 投影是其他字段的 bool 值的结果

node.js - 如何*不*保存 Mongoose 文档?

mysql - 在 mongoDb、Mysql 和 hadoop 之间做出选择

node.js - 如何使用 Moongoose 访问整个子文档(对象数组中的对象数组)?

mongodb - 对大量数据使用 Mongo 地理空间查询

ruby-on-rails - 无架构数据库 : Indexing dynamically-typed things by their properties?

node.js - Mongoose - 检查 `upsert` 是否创建了新文档

python - GDAL : Reprojecting netCDF file

mysql - 在Mysql中设置空间精度

mongodb - 如何使用 mongodb 聚合返回字符串数组