如何使用DynamoDB批量删除?

时间:2016-07-19 17:41:23

标签: node.js amazon-dynamodb

我收到一条错误消息“提供的关键元素与架构不匹配”。 uuid是我的主分区键。我还有version的主要排序键。我想我可以使用batchWritedocs)删除所有具有相同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;
}

不确定为什么它是主键的错误。我曾经看过有关在我搜索不是关键字的时候需要其他索引的帖子。但我不相信这就是这种情况。

5 个答案:

答案 0 :(得分:10)

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

表定义: -

包 - 表名

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: {} }

答案 1 :(得分:1)

这是完全可能的,您最好使用Node lambda,并且需要为大型数据库考虑一些事项:

void test_clone_labeled_graph() [with VertexSelector = boost::vecS]
====
11 -->
22 -->
33 --> 22
Vertex B NodeInfo1.i after copy: 22
Edge has property EdgeInfo1 17
Removed A:
====
22 -->
33 --> 22
void test_clone_labeled_graph() [with VertexSelector = boost::listS]
====
11 -->
22 -->
33 --> 22
Vertex B NodeInfo1.i after copy: 22
Edge has property EdgeInfo1 17
Removed A:
====
22 -->
33 --> 22
void test_clone_labeled_graph() [with VertexSelector = boost::setS]
====
11 -->
22 -->
33 --> 22
Vertex B NodeInfo1.i after copy: 22
Edge has property EdgeInfo1 17
Removed A:
====
22 -->
33 --> 22

答案 2 :(得分:0)

请注意,您需要按照说明进行操作:

src:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

  

DeleteRequest-对指定项目执行DeleteItem操作。要删除的项目由Key子元素标识:

     

Key-唯一标识项目的主键属性值的映射。该映射中的每个条目均包含一个属性名称和一个属性值。对于每个主键,您必须提供所有键属性。例如,使用简单的主键,您只需为分区键提供一个值。对于复合主键,必须同时提供分区键和排序键的值。

答案 3 :(得分:0)

不确定为什么没有人提供正确答案。

这是我在nodeJS中执行的lambda。它将在表上进行全面扫描,然后每个请求每25个项目批量删除。

请记住要更改TABLE_NAME

const AWS = require('aws-sdk');

const docClient = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });

//const { TABLE_NAME } = process.env;
TABLE_NAME = "CHANGE ME PLEASE"

exports.handler = async (event) => {
    let params = {
        TableName: TABLE_NAME,
    };

    let items = [];
    let data = await docClient.scan(params).promise();
    items = [...items, ...data.Items];

    while (typeof data.LastEvaluatedKey != 'undefined') {
        params.ExclusiveStartKey = data.LastEvaluatedKey;

        data = await docClient.scan(params).promise();
        items = [...items, ...data.Items];
    }

    let leftItems = items.length;
    let group = [];
    let groupNumber = 0;

    console.log('Total items to be deleted', leftItems);

    for (const i of items) {
        const deleteReq = {
            DeleteRequest: {
                Key: {
                    id: i.id,
                },
            },
        };

        group.push(deleteReq);
        leftItems--;

        if (group.length === 25 || leftItems < 1) {
            groupNumber++;

            console.log(`Batch ${groupNumber} to be deleted.`);

            const params = {
                RequestItems: {
                    [TABLE_NAME]: group,
                },
            };

            await docClient.batchWrite(params).promise();

            console.log(
                `Batch ${groupNumber} processed. Left items: ${leftItems}`
            );

            // reset
            group = [];
        }
    }

    const response = {
        statusCode: 200,
        //  Uncomment below to enable CORS requests
        //  headers: {
        //      "Access-Control-Allow-Origin": "*"
        //  },
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

答案 4 :(得分:0)

对于批量删除,我们可以使用带有 DeleteRequest 的 batchWrite。这是一个例子,在这个例子中,我们提供了要删除其数据的 tableName,有效负载是我们需要删除的 id 数组。 在单个请求中可以删除 25 个项目。

const AWS = require('aws-sdk');
const dynamodb= new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });

const tableName = "PlayerData";
const payload = [{id=101}, {id=105}, {id=106}];

    const deleteBatchData = async (tableName, payload, dynamodb) => {
        try {
            await dynamodb.batchWrite({
                RequestItems: {
                    [tableName]: payload.map(item => {
                        return {
                            DeleteRequest: {
                                Key: {
                                    id: item.id
                                }
                            }
                        };
                    })
                }
            }).
            promise().
            then((response) => {
                    return response;
                })
                .catch((err) => {
                    console.log("err ::", JSON.stringify(err))
                });
        } catch (err) {
            console.log('Error in deleteBatchData ', err);
        }
    }