我有一个带有解析器的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。似乎不是很好的解决方案。