如何在嵌套文档数组上使用$geoNear?

4

我的文档结构如下:

{ agency_key : '',
  route_id: '',
  direction_id: '',
  stops: [ 
           {stop_id:15, 
            stop_lat: '',
            stop_lon: '',
            loc: [-83.118972, 42, 121567]
            },
            {...
            }
          ]
}

我希望找到距离集合中每个文档给定的(lat,lon)对一定距离内的车站。我创建了2D索引。我尝试使用$unwind,然后使用$geoNear,但是它说$geoNear只能在管道的第一阶段执行。我尝试了以下操作:

db.tm_stops.aggregate([ 
... { 
...  $geoNear: { near: {coordinates: [-82.958841, 42.370114] },      distanceField: "stops.calculated", query: { agency_key: "DDOT"}, 
... includeLocs: "stops.loc" }
... }
... ])

我尝试了以下操作:
 db.tm_stops.find({stops:{$near:[-82.958841, 42.370114], $maxDistance: 1 } } )

它报出这个错误:
error: {
    "$err" : "Unable to execute query: error processing query: ns=gtfs.tm_stops limit=0 skip=0\nTree: GEONEAR  field=stops maxdist=1 isNearSphere=0\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query",
    "code" : 17007

我的Mongo查询应该是什么?我需要从Node.js应用程序中执行此查询,但我希望首先在Mongo shell中看到一些结果。谢谢。

1个回答

5

我终于使查询工作了。为了将来参考,我回答自己的问题。 由于我使用的是二维索引而不是二维球体索引,所以在near操作符中我不必使用coordinates。这个查询可以工作:

db.tm_stops.aggregate([ 
 { 
  $geoNear: 
    { near: [-82.958841, 42.370114] ,     
     distanceField: "stops.calculated", 
     query: { agency_key: "DDOT"}, 
     includeLocs: "stops.loc" }
     }
   ])

但是我发现,在返回的文档中,我只能看到计算出的距离和用于计算距离的(lon, lat)对。我无法真正返回用于计算的整个嵌入式文档。如果我找到了返回整个嵌入式文档的方法,我会更新我的答案。

1
添加像文档中那样的“key”是不够的。同时添加“includeLocs”可以帮助... - Farandole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接