如何在MongoDB中正确有效地分页$ geoNear查询?

时间:2019-06-03 11:18:17

标签: mongodb mongodb-query aggregation-framework graphql graphql-js

我有一个带有解析器的GraphQL API,可以按距MongoDB的距离来获取营业地点,因此我需要分页。

目前,我的解析器定义为:

locationsNearby(coordinates: [Float!]! first: Int after: Float): [Location]!

first是要获取的结果数,after是从开始获取结果的最小距离。

所以,我有下一个MongoDB查询:

$geoNear: {
  spherical: true,
  near: { coordinates, type: "Point" },
  limit: first,
  minDistance: after,
  distanceField: "distance",
}

但是麻烦的是我可以在几个距离相同的地点工作,例如,同一栋建筑物中不同楼层的商家。

例如下一个数据集:

{ id: 1, geometry: { type: "Point", coordinates: [10, 10] }, // distance: 10
{ id: 2, geometry: { type: "Point", coordinates: [20, 20] }, // distance: 20
{ id: 3, geometry: { type: "Point", coordinates: [20, 20] }, // distance: 20
{ id: 4, geometry: { type: "Point", coordinates: [20, 20] }, // distance: 20
{ id: 5, geometry: { type: "Point", coordinates: [30, 30] }, // distance: 30

当我查询first: 2 after: 0时,我得到的ID [1, 2]都正确,但是当我查询first: 2 after: 20时,我得到了ID [2, 3]

我最好的办法是求和1米,但是它不能解决问题,因为:当我查询first: 2 after: 0时,我得到的ID [1, 2]都正确,但是当我查询first: 2 after: 21时,我得到了ID [5]

搜索后,我发现此旧博客帖子:https://emptysqua.re/blog/paging-geo-mongodb/

但是,如果我对帖子了解清楚,建议的解决方案是在查询中发送所有先前的ID。因此,如果我请求每页100个结果,而我得到11页,例如,要获得第11页,则需要发送1000个ID。似乎不是很好的解决方案。

0 个答案:

没有答案