DynamoDB 从 属性 等于值的列表中删除地图

DynamoDB remove Map from List where property equals value

如何使用 属性 值删除 dynamo 列表中的地图?

这是 dynamo 记录结构

{
  "authorizedUsers": [
    {
      "name": "Bob",
      "phoneNumber": "822-222-2221"
    },
    {
      "name": "Joe",
      "phoneNumber": "111-111-2221"
    }
  ],
  "PK": "users"
}

目前我有


    var params = {
        TableName: 'userTable',
        Key: {
            PK: 'users'
        },
        UpdateExpression: 'REMOVE authorizedUsers[0]',
        ReturnValues: 'UPDATED_NEW'
    };

    try {
        await docClient.update(params).promise();
    } catch (e) {
        throw new Error(e.message);
    }

这会删除第一条记录没问题,但我需要表达式更加动态并且能够通过 phoneNumber(唯一标识符)删除行 我如何修改它以使用 phoneNumber 识别要删除的列表中的正确地图?

您不能使用 phoneNumber 来标识列表中的地图项。

您声明 phoneNumber 是唯一标识符。我建议将您的项目的模型更改为不使用数组,而是使用以 phoneNumber 作为键的映射。

{
  "authorizedUsers": {
    "822-222-2221": {
      "name": "Bob",
      "phoneNumber": "822-222-2221"
    },
    "111-111-2221": {
      "name": "Joe",
      "phoneNumber": "111-111-2221"
    }
  ,
  "PK": "users"
}

如果您无法更改项目的结构,请考虑对项目和 over-writing 整个 authorizedUsers 数组属性进行版本控制。您将希望在所有项目上创建一个 Version_ID 作为一次性操作(或者不这样做并假设所有没有版本号的项目的隐式版本 0)。

当您想要更新某个项目的 authorizedUsers 属性时,请先阅读该项目。然后用新数组创建一个 Update 操作,同时增加 Version_ID 属性。最后,添加一个 ConditionExpression 以检查 Version_ID 属性值仍然是您第一次读取该项目时的值,以确保在此期间另一个进程没有更新该项目。