【问题标题】:How to delete entry in dynamodb list?如何删除 dynamodb 列表中的条目?
【发布时间】:2018-04-14 19:22:40
【问题描述】:

我有一个 lambda 函数,它充当用户得分最高的表格上的触发器,以处理排行榜表格。

在我的排行榜表中,排序键是分数,玩家的名字是一个单独的条目,带有一个列表,因为可能有多个玩家具有相同的分数。没关系。

所以当我添加一个玩家时:

var paramsNewEntry = {
            "TableName": leaderboardTable,
            "Key": {
                "trackId": trackId,
                "time": newValue
            },
            "UpdateExpression": "SET players = list_append(if_not_exists(players, :emptyList), :playersList),
            "ExpressionAttributeValues": {
                ":playersList": [userId],
                ":emptyList":[]
            },
            "ReturnValues": "NONE"
        };

这很好用。我想这样删除它:

var paramsOldEntry = {
                    "TableName": myTable,
                    "Key": {
                        "trackId": trackId,
                        "time": oldValue
                    },
                    "UpdateExpression": "DELETE players :playerToRemove",
                    "ExpressionAttributeValues": {
                        ":playerToRemove": [userId]
                    },
                    "ReturnValues": "ALL_NEW"
                }

但我得到:Invalid UpdateExpression: Incorrect operand type for operator or function; operator: DELETE, operand type: LIST 错误。

players属性是一个列表,查询响应示例:

{
  "Items": [
    {
      "time": {
        "N": "99994"
      },
      "players": {
        "L": [
          {
            "S": "krystianPostman2"
          }
        ]
      },
      "trackId": {
        "S": "betaTrack001"
      }
    }
  ],
  "Count": 1,
  "ScannedCount": 1,
  "LastEvaluatedKey": {
    "time": {
      "N": "99994"
    },
    "trackId": {
      "S": "betaTrack001"
    }
  }
}

在使用 dynamodb 文档 API 时,我没有看到任何关于 SO 的问题,它会在 javascript 中提供任何详细信息。

【问题讨论】:

  • 如果列表中有多个值,您只需从列表中删除一个条目?
  • 没关系,删除指定的条目即可。它始终是一个列表,如果在我删除最后一个列表后没有其他值,我将在响应数据中检测到并完全删除该条目。
  • 在否决我的问题时,我非常感谢您的评论。为什么投反对票?不合适吗?缺少示例/代码示例?
  • 有点问题,但使用 Redis 是排行榜的一个不错的选择。它有一种称为sorted set 的类型,非常适合排行榜。它使添加和更新高分变得非常简单,消除了这一点的逻辑。但是,请了解您是否希望使架构更简单并可能降低成本。

标签: javascript amazon-dynamodb aws-lambda


【解决方案1】:

DynamoDB API 没有根据其值从 LIST 数据类型中删除该值的选项。但是,如果您知道要删除的值的索引,则可以使用 REMOVE 从列表中删除该条目。

DELETE 操作仅支持 Set 数据类型。

UpdateExpression: 'REMOVE players[0]'

如果 LIST 将只有 name 属性,最好将其保存为 SET 而不是 LIST DynamoDB 数据类型。

创建集:-

var docClient = new AWS.DynamoDB.DocumentClient();
docClient.createSet( ["v1", "v2"]);

Deleting the values from SET using DELETE

【讨论】:

  • 如果我更改要存储为设置的值怎么样?那么 DELETE 会起作用吗?我正在重写一切来处理它,但如果我事先知道它没有帮助,我不会浪费我的时间。
  • 是的,您可以从 SET 中删除该项目。添加了包含一些示例的参考链接。
  • 是的,先生。我已将所有内容更改为套装,非常完美。
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 2020-11-17
  • 1970-01-01
  • 2014-05-14
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多