如何在DynamoDB中删除多行数据?

11

我试图从DynamoDB表中删除数据。

如果我使用分区键进行删除,它可以正常工作。

但是,如果我尝试使用其他任何字段删除多行,则会失败。

  var params = {
    TableName: "test",
    Key: {
      dmac: dmac,
    },
    ConditionExpression: "dmac= :dmac"
  };

  docClient.delete( params, (error) => {
    if (error) {
      console.log( "Delete data fail" );
    } else { 
      console.log( "Delete data Success" );
    }
  });

寻找这个吗?https://dev59.com/VlYO5IYBdhLWcg3wHeBo - skott
1
是否有任何已发布的答案解决了您的问题?如果是,请接受它。这将有助于未来寻找答案的读者。 - jarmod
2个回答

23

DynamoDB中的项(或行)由其主键唯一标识。表可以有一个简单的主键(即一个分区键)或一个复合主键(即一个分区键加上一个排序键)。

要删除一项,必须提供完整的主键(无论是简单的分区键还是复合分区键加排序键)。

因此,如果您想删除符合特定条件的项,例如最大速度小于120的汽车,则应发出查询或扫描以识别这些项,检索主键,然后在第二个操作中删除这些项。

要删除单个项,请使用DeleteItem。要删除多个项,请使用BatchWriteItem。尽管名为BatchWriteItem,但它可用于放置多个项或删除多个项,并且您可以在同一个API调用中针对一个或多个DynamoDB表。

以下是AWS SDK v2删除多个项的示例:

const aws = require("aws-sdk");
const ddb = new aws.DynamoDB({ region: "us-east-1" });

(async () => {
  const params = {
    RequestItems: {
      albums: []
    }
  };

  params.RequestItems.albums.push({
    DeleteRequest: {
      Key: {
        pk: { S: "The Who" },
        sk: { S: "Tommy" }
      }
    }
  });

  params.RequestItems.albums.push({
    DeleteRequest: {
      Key: {
        pk: { S: "The Beatles" },
        sk: { S: "Abbey Road" }
      }
    }
  });

  await ddb.batchWriteItem(params).promise();
})();

这是一个AWS SDK v3删除多个项的示例:

const {
  BatchWriteItemCommand,
  DynamoDBClient
} = require("@aws-sdk/client-dynamodb");
  
(async () => {
  const client = new DynamoDBClient({ region: "us-east-1" });

  const params = {
    RequestItems: {
      albums: []
    }
  };

  params.RequestItems.albums.push({
    DeleteRequest: {
      Key: {
        pk: { S: "The Who" },
        sk: { S: "Tommy" }
      }
    }
  });

  params.RequestItems.albums.push({
    DeleteRequest: {
      Key: {
        pk: { S: "The Beatles" },
        sk: { S: "Abbey Road" }
      }
    }
  });

  await client.send(new BatchWriteItemCommand(params));
})();

2
BatchWriteItem 这里真的需要一个例子。提供链接并不理想。 - Houman
2
@Houman 好主意,已添加v2和v3示例。 - jarmod

3
在 DynamoDB 中,你只能使用键来删除一项记录(即表的分区键和排序键(如果在表中定义了排序键))。例如,delete 操作的规范中要求必须包含 Key 属性,这强调了这一点。请参见:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html#DDB-DeleteItem-request-Key 这意味着,如果你想使用其他属性来删除一个项,你必须先按照你拥有的属性查找这个项,从返回的项中提取出键,然后使用该键删除该项。
“通过非键属性查找项”的标准解决方案是,在表上定义具有那些属性作为 GSI 键的全局二级索引(GSI)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接