如何根据数据集的位置动态过滤数据集

时间:2018-07-24 08:22:18

标签: mongodb geospatial geojson

我正在尝试通过mongodb查询实现以下行为:

  • 我有一些文档,其中包含一个字段location和该字段上2dshere的地理空间索引
  • 文档中还有一个字段maxdistance
  • 用户的位置在变量user.gps中作为GeoJSON点可用

查询当前如下所示:

query["location"] = {
     $nearSphere: {
      $geometry: user.gps,
      $maxDistance: filterDistance
    }
};

此查询成功选择了相对于用户的给定filterDistance中的所有数据集。

我现在想要的是“如果document.maxdistance字段> 0并且到用户的距离大于document.maxdistance”,请不要选择数据集。

因此,如果用户居住的距离大于保存在文档中的给定距离,则我找不到该文档。

我不知道在mongodb查询中表达这一点很热,我找不到这种查询的任何示例。

1 个答案:

答案 0 :(得分:1)

$ near / $ nearSphere不支持每个文档的距离。仅每个查询。主要原因是按距离排序。如果只需要过滤,则可以使用$ geoIntersects / $ geoWithin,但是您需要更改文档以包含覆盖区域的多边形,例如围绕其位置的圆圈Pi*2*distance

示例:

假设您有一个文档:

{
    loc: { type: "Point", coordinates: [ 10, 20 ] },
    distance: 10
}

这样,当用户的坐标位于半径之内时,例如,返回它。 [12, 25],并且当用户的坐标位于外部时(例如, [12,30]

为此,应更新文档以将loc/distance对转换为多边形。为了简单起见,我将使用八边形,但您可能需要增加顶点数量以获得更准确的结果:

{
    loc: { type: "Point", coordinates: [ 10, 20 ] },
    distance: 10,
    area: {
        type : "Polygon",
        coordinates : [[ 
            [ 17, 27 ], 
            [ 10, 30 ], 
            [ 3, 27 ], 
            [ 0, 20 ], 
            [ 3, 13 ], 
            [ 10, 10 ], 
            [ 17, 13 ], 
            [ 20, 20 ], 
            [ 17, 27 ] 
        ]]
    }
}

然后您可以使用$geoIntersects查找包含用户坐标的区域的文档:

db.collection.find({
    area: {
        $geoIntersects: {
            $geometry: { type: "Point" , coordinates: [ 12, 25] }
        }
    }
})