如何使用 DynamoDB 批量删除?

新手上路,请多包涵

我收到“提供的关键元素与架构不匹配”的错误。 uuid 是我的主分区键。我还有一个 version 的主排序键。我想我可以使用 batchWrite文档)删除所有具有相同 uuid 的项目。

我的 ES6 代码如下:

 delete(uuid) {
  const promise = new Promise();
  const params = {
    RequestItems: {
      [this.TABLE]: [
        {
          DeleteRequest: {
            Key: { uuid: uuid }
          }
        }
      ]
    }
  };

  // this._client references the DocumentClient
  this._client.batchWrite(params, function(err, data) {
    if (err) {
      // this gets hit with error
      console.log(err);
      return promise.reject(err);
    }

    console.log(result);
    return promise.resolve(result);
  });

  return promise;
}

不知道为什么它在主键上出错。当我搜索一些不是关键的东西时,我曾经看过一些关于需要其他索引的帖子。但我不相信这里的情况。

原文由 Dave Stein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 829
2 个回答

这是批量写入删除请求示例。此代码已经过测试并且工作正常。如果您根据需要更改此代码,它应该可以工作。

表定义:-

包 - 表名称

包 - 哈希键

“Bag”表中没有分区键

批量写入代码:-

 var AWS = require("aws-sdk");

AWS.config.update({
    region : "us-west-2",
    endpoint : "http://localhost:8000"
});

var documentclient = new AWS.DynamoDB.DocumentClient();

var itemsArray = [];

var item1 = {
    DeleteRequest : {
        Key : {
            'bag' : 'b1'
        }
    }
};

itemsArray.push(item1);

var item2 = {
    DeleteRequest : {
        Key : {
            'bag' : 'b2'
        }
    }
};

itemsArray.push(item2);

var params = {
    RequestItems : {
        'Bag' : itemsArray
    }
};
documentclient.batchWrite(params, function(err, data) {
    if (err) {
        console.log('Batch delete unsuccessful ...');
        console.log(err, err.stack); // an error occurred
    } else {
        console.log('Batch delete successful ...');
        console.log(data); // successful response
    }

});

输出:-

 Batch delete successful ...
{ UnprocessedItems: {} }

原文由 notionquest 发布,翻译遵循 CC BY-SA 3.0 许可协议

这对于 Node lambda 是可行的,但是在处理大型数据库时需要考虑一些事项来解决并发问题:

这是我写的一个片段:

 const AWS = require("aws-sdk");
const dynamodb = new AWS.DynamoDB.DocumentClient();
const log = console.log;

exports.handler = async (event) => {

  log(event);
  let TableName = event.tableName;
  let params = {
  let TableName,
        FilterExpression: "userId = :uid",
        ExpressionAttributeValues: {
          ":uid": event.userId,
        },
      };
  let getItems = async (lastKey, items) => {
        if (lastKey) params.ExclusiveStartKey = lastKey;
        let resp = await dynamodb.scan(params).promise();
        let items = resp.Items.length
               ? items.concat(resp.Items.map((x) => x.id))
               : items;
        if (resp.LastEvaluatedKey)
          return await getItems(resp.LastEvaluatedKey, items);
        else return items;
      };
  let ids = await getItems(null, []);
  let idGroups = [];

  for (let i = 0; i < ids.length; i += 25) {
    idGroups.push(ids.slice(i, i + 25));
  }

  for (const gs of idGroups) {
    let delReqs = [];
    for (let id of gs) {
      delReqs.push({ DeleteRequest: { Key: { id } } });
    }
    let RequestItems = {};
    RequestItems[TableName] = delReqs;
    let d = await dynamodb
      .batchWrite({ RequestItems })
      .promise().catch((e) => log(e));
  }
  log(ids.length + " items processed");
  return {};
};

原文由 Mike Bendorf 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题