使用管道解析器高效地分页结果

0

【以下的问题经过翻译处理】 我有一个管道解析器,它:

  1. 查询数据库以获取用户曾经访问过的所有地点。
  2. 查询第二个数据库,以获取所有附近的地点。
  3. 过滤并仅返回用户尚未访问过的附近地点。

我想分页这些结果,但我关心效率。

是否可以缓存第一部分,以便每当用户请求下一节数据时无需重新计算?最好的方法是什么?

目前,如果第二部分限制为10个元素,它们都可以在第三部分中被过滤掉,但下一个查询可能会发现只有6个元素被过滤掉。

如果存在足够匹配的元素,查询是否可以返回与限制长度相等的列表?

profile picture
专家
已提问 8 个月前136 查看次数
1 回答
0

【以下的回答经过翻译处理】 我认为以你描述的方式在DynamoDB中实现这个访问模式可能会很困难。以下是几个可能适用于你的用途的选项。

  1. 在客户端上分解解析器和过滤器。

你可以在位置类型中添加一个字段 isVisited: Boolean 并附加一个解析器,如果当前用户已经访问过该位置,则返回 true,否则返回 false。Location.isVisited 解析器可以在 DynamoDB 中进行相邻列表查找,以查看当前用户是否访问了该位置。从客户端开始,您可以查询附近的位置并在客户端处理过滤器,其中isVisited字段为false。

  1. 使用Lambda函数。

你可以实现自己的分页机制,迭代直到已找到与请求要求的一样多的项。您可以在Lambda上托管此逻辑,并在那里执行更复杂的查询。

  1. 使用异步流程。

值得考虑将其转换为异步流程,这将允许您有效地循环遍历所需的项目,而无需担心在查询时加入不同的集。

例如,您可以拥有一个变异字段 "getUnvisitedNearbyLocationFeed":

type Mutation {  
  getUnvisitedNearbyLocationFeed(location: String): ID  
}  

它调用一个Lambda函数来执行以下操作:

  1. 为该源创建一个唯一的ID。
  2. 获取输入geohash中的所有位置。
  3. 将附近的位置与所有当前登录用户已访问的位置进行比较。
  4. 为您要进行分页的某些属性对附近的项目进行排序,将记录放入用户 / geohash特定源中。

例如,您可以使用以下变异程序开始该进程:

mutation { getUnvisitedNearbyLocationFeed(location: "gbsuv") }  

在第二步中,您将获得所有附近的位置,并最终得到一些集合:

(loc_id, geohash, name) [(1, gbsuv..., "Place 1"), (2, gbsuv..., "Place 2"), (3, gbsuv..., "Place 3")]

在第二步中,您将获取当前登录用户已访问过的所有附近位置:

[(2, gbsuv..., "Place 2")]

在第三步中,您将从第一个集合中减去第二个集合

[(1, gbsuv..., "Place 1"), (3, gbsuv..., "Place 3")]

您还可以利用这个机会为项目计算一个分数,以确定反馈中项目的顺序。这可以是简单的时间戳或更复杂的内容。一旦您获得了这些项目,将它们放入具有以下关键结构的表中:

feed_id (HASH KEY) | score (SORT KEY) | loc_id | user_id | ... (the-feed-id, 1000, 1, user1) (the-feed-id, 1001, 3, user1)

在您的客户端上,创建附近位置反馈后,您可以存储feed_id,并随时查询此集合,而无需一次又一次地重新计算用户尚未访问的位置。您还可以扩展上面的示例以构建分页功能,以便根据需要刷新和追加反馈。

以上内容的组合或完全不同的内容。 这只是众多可能方式中的一种,希望能提供一些思路。

profile picture
专家
已回答 8 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则