MongoDB:在一个查询中使用带有$ near的$ geoIntersects或$ geoWithin

时间:2014-12-30 17:47:05

标签: mongodb geospatial

我想查询具有包含点的多边形的所有文档,然后查询该结果集,根据该点与文档位置的接近程度对其进行排序。

所以想象一下,我有一个朋友数据库,因为我很酷,并希望看到哪些朋友在我的范围内,并愿意来玩。 (每个朋友都有一个游戏日期多边形,这是他们愿意为游戏日期旅行的范围)

对于所有比赛,我希望他们继续看看我应该根据他的实际地址和我到我的地点的距离(这是我的地址)来打电话给我,以便我可以确定他是否可以接受他们的到来从遥远的地方。 (比方说300米)

到目前为止,我在查询下面找到了我的观点所包含的多边形,但我不知道如何包含mongodb的$ near运算符

对于JSON:

{ "_id" : "objid", "FRIEND_NAME" : "Bobby", "GEOMETRY" : {"type":"Polygon","coordinates":[[[-73.98779153823898,40.718233223261],[-74.004946447098,40.723575517498],[-74.006771211624,40.730592217474],[-73.99010896682698,40.746712376146], [-73.973135948181,40.73974615047701],[-73.975120782852,40.736128627654],[-73.973997695541,40.730787341083],[-73.983317613602,40.716639396436],[-73.98779153823898,40.718233223261]]]}, "FRIEND_POSITON" : { "lon" : -73.992188, "lat" : 40.729359 } }

这有效:

db.friends.find({ "PLAYDATE_RANGE":{ "$geoIntersects":{ "$geometry":{ "type":"Point", "coordinates":[ -73.98652, 40.752044 ] } } } })

这不是:

db.friends.find([ { "PLAYDATE_RANGE":{ "$geoIntersects":{ "$geometry":{ "type":"Point", "coordinates":[ -73.98652, 40.752044 ] } } } }, { "FRIEND_POSITON":{ "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -73.98652, 40.752044 ] }, "maxDistance":300 } } } ])

请帮助我解决上面无法解决的问题。

1 个答案:

答案 0 :(得分:1)

这需要aggregate pipeline。根据{{​​3}},您只能使用$ geoNear作为管道的第一阶段。聚合函数有一个附加查询的条目,在该查询中,多边形查询将用于根据文档的PLAYDATE_RANGE字段中的包含来缩小结果。

db.friends.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ -73.98652 , 40.752044 ] },
        maxDistance: 300,
        distanceField: "friends.calculated_distance",
        query: {
       "PLAYDATE_RANGE":{
          "$geoIntersects":{
             "$geometry":{
                "type":"Point",
                "coordinates":[
                   -73.98652,
                   40.752044
                ]
             }
          }
       }
    },
        spherical: true

     }
   }
])

P.S。请注意,只能使用一个地理空间索引,因此将其放在FRIEND_POSITION字段上。如果添加需要正确形成的GeoJSON值的2sphere索引,特别是

“FRIEND_POSITION”:{“type”:“Point”,“coordinates”:[ - 73.992188,40.729359]}

因此文档应如下所示:

{ "_id" : "objid", "FRIEND_NAME" : "Bobby", "GEOMETRY" : {"type":"Polygon","coordinates":[[[-73.98779153823898,40.718233223261],[-74.004946447098,40.723575517498],[-74.006771211624,40.730592217474],[-73.99010896682698,40.746712376146],    [-73.973135948181,40.73974615047701],[-73.975120782852,40.736128627654],[-73.973997695541,40.730787341083],[-73.983317613602,40.716639396436],[-73.98779153823898,40.718233223261]]]}, "FRIEND_POSITION" : { "type" : "Point", "coordinates" : [ -73.992188, 40.729359 ] } }