Mongo查询$ geoWithin和$ near

时间:2018-03-15 11:45:29

标签: mongodb mongodb-query aggregation-framework

我的用例是我希望得到一个城市内的所有记录,附近的某个位置应该是第一位的。 可以说我有以下记录:

{"name" : "A", "location" : {"point" : [latlngs1]}}, //LatLng1 is in cityA
{"name" : "B", "location" : {"point" : [latlngs2]}}, //LatLng2 is in cityB
{"name" : "C", "location" : {"point" : [latlngs3]}}, //LatLng3 is in cityA
{"name" : "D", "location" : {"point" : [latlngs4]}}  //LatLng4 is in cityA

我希望在附近的latlng5中获得CityA内的所有记录。

说距离bw位置点

[latlng5, latlng1] --> 10 unit
[latlng5, latlng3] --> 5 unit
[latlng5, latlng4] --> 8 unit

所以结果应该是这样的:

{"name" : "C"},
{"name" : "D"},
{"name" : "A"}

通过我的研究,我发现$geoWithin最适用于有界查询,因此我可以使用$ geoWithin在城市中查找记录。

  

db.TEST.aggregate([{$ match:{“location.point”:{$ geoWithin:{$ box:   [[northEastLngLat],[SouthWestLngLat]]}}},{$ project:   {name:1}}])。pretty();

这带来了记录:A,C和D. 现在,对于附近的地方,我发现$geoNear适合这里。 所以查询就像:

  

b.TEST.aggregate([{“$ geoNear”:{near:[latlng5],distanceField:   “distance”,spherical:true}},{$ match:{“location.point”:   {$ geoWithin:{$ box:[[northEastLngLat],[SouthWestLngLat]]}}},   {$ project:{name:1}}])。pretty();

但这不会产生任何结果。我尝试将latlngs更改为接近$,有时候只会产生1个结果和其他0个结果。

我的查询有什么问题。请帮忙。 谢谢

1 个答案:

答案 0 :(得分:1)

您应该尝试这样,它将获取10公里内的所有记录

 db.city.find({ 
   location :{
     $near : {
  $geometry : {   
     index : "Point" ,
     coordinates : [19.1, 72.89]
    },
 $maxDistance : 10000
}
 }
     })

它将返回所有记录,并确保您有位置索引