【问题标题】:How to find index of a list in dynamodb?如何在 dynamodb 中查找列表的索引?
【发布时间】:2016-06-11 08:13:10
【问题描述】:

我将 Python 的 boto3 用于 Amazon 的 api 和 dynamodb。

我想存储喜欢帖子的人的 ID。当有人喜欢帖子时,我目前正在附加到该列表(每个帖子都有 likeBy 列表)。 当有人喜欢帖子时,我正在使用 SET likedBy = list_append(likedBy, :v) 添加到列表中。 例如:

"likedBy" : [
    {
      "on": 1455736397,
      "userId": 232323
    },
    {
      "on": 1455736398,
      "userId": 46
    }]

但是当他们再次不喜欢时,我如何从列表中删除该特定用户?而且我想确保一个用户只能喜欢一次帖子? (确保 likeBy 列表中的 userId 是唯一的

我能想到的一个解决方案是获取整个列表并检查列表是否有 userId,然后找到索引并使用 AWS updateexpression REMOVE likedBy[index] 删除。 (我知道这不是正确的方法)

【问题讨论】:

  • 你的 dynamodb 哈希/范围键是什么?
  • 哈希键是 postId,我没有范围键。我可以使用 postId 访问 likeBy 列表,但我想使用内部嵌套元素操作列表项

标签: python python-2.7 amazon-web-services amazon-dynamodb boto


【解决方案1】:

你不需要使用列表索引。

您的表格方案应该是:

hash_key=post_id
range_key=user_id

现在,这将允许您:

  1. get all likes(user_ids) 属于一个帖子 id
  2. 强制唯一性。 (post_id 只有一条记录 - user_id)
  3. 删除属于user_id的post_id

【讨论】:

  • 我不能将 user_id 作为范围键,因为单个用户可以创建多个帖子。我想在列表中存储喜欢帖子的人的列表(这将是该帖子的属性)
  • 为什么不能将 user_id 作为范围键?即使用户可以创建多个帖子?如果您需要一个喜欢帖子的人的列表,那么您可以添加全局二级索引(hash:user_id, range:post_id)。这正是 dynamodb 的强大之处,您无需在应用程序级别使用它。如果需要,它还允许您使用分页。
  • 是的,我明白你的意思。但我也有 cmets 和股票。那么您是否建议使用 3 个表来维护喜欢、分享和 cmets(看起来不错,但是如果有很多帖子和很多喜欢怎么办)或 1 个表,其中包含用于喜欢、分享和 cmets 的嵌套元素(唯一性将是一个问题和删除)
  • 您应该有 1 个表,其中包含 3 个全局二级索引(哈希/范围)(一个用于点赞,一个用于评论,一个用于分享)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2021-04-05
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多