- 最新
- 投票最多
- 评论最多
【以下的回答经过翻译处理】 我认为以你描述的方式在DynamoDB中实现这个访问模式可能会很困难。以下是几个可能适用于你的用途的选项。
- 在客户端上分解解析器和过滤器。
你可以在位置类型中添加一个字段 isVisited: Boolean
并附加一个解析器,如果当前用户已经访问过该位置,则返回 true,否则返回 false。Location.isVisited
解析器可以在 DynamoDB 中进行相邻列表查找,以查看当前用户是否访问了该位置。从客户端开始,您可以查询附近的位置并在客户端处理过滤器,其中isVisited
字段为false。
- 使用Lambda函数。
你可以实现自己的分页机制,迭代直到已找到与请求要求的一样多的项。您可以在Lambda上托管此逻辑,并在那里执行更复杂的查询。
- 使用异步流程。
值得考虑将其转换为异步流程,这将允许您有效地循环遍历所需的项目,而无需担心在查询时加入不同的集。
例如,您可以拥有一个变异字段 "getUnvisitedNearbyLocationFeed":
type Mutation {
getUnvisitedNearbyLocationFeed(location: String): ID
}
它调用一个Lambda函数来执行以下操作:
- 为该源创建一个唯一的ID。
- 获取输入geohash中的所有位置。
- 将附近的位置与所有当前登录用户已访问的位置进行比较。
- 为您要进行分页的某些属性对附近的项目进行排序,将记录放入用户 / 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,并随时查询此集合,而无需一次又一次地重新计算用户尚未访问的位置。您还可以扩展上面的示例以构建分页功能,以便根据需要刷新和追加反馈。
以上内容的组合或完全不同的内容。 这只是众多可能方式中的一种,希望能提供一些思路。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前