如果条目已存在,如何防止覆盖 DynamoDB 项目 [英] How to prevent a DynamoDB item being overwritten if an entry already exists

查看:18
本文介绍了如果条目已存在,如何防止覆盖 DynamoDB 项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个 lambda 函数来将新数据添加到 DynamoDB 表中.从阅读文档:

Im trying to write a lambda function to add new data to a DynamoDB Table. From reading the docs at:

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-propertyPUT 方法:创建一个新项目,或通过委托给 AWS.DynamoDB.putItem() 将旧项目替换为新项目."

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property The PUT method: "Creates a new item, or replaces an old item with a new item by delegating to AWS.DynamoDB.putItem()."

除了在放置"之前检查对象之外,是否有设置或标志在尝试 PUT 时使对象存在失败?

Other than doing a check for an object before 'putting' is there a setting or flag to fail the object exists when the PUT is attempted?

我可以看到

params -> Expected -> Exists (Bool)

但看不到任何有关此功能的文档.

but can't see any documentation on what this does.

防止项目覆盖的最佳架构(或禁食)是什么?

What would be the best architecture (or fasted) to prevent an item overwrite?

Query the table first and if no item exists then add the item

Attempt to insert the item and on failure because of duplicate entry report this back? (Is there a way to prevent item overwrite?)

推荐答案

ConditionExpression可以用来检查表中是否已经存在key属性值,只有key值存在才进行PUT操作表中不存在.

The ConditionExpression can be used to check whether the key attribute values already exists in table and perform the PUT operation only if the key values are not present in the table.

当你运行下面的代码时,第一次 put 操作应该是成功的.在第二次运行中,put 操作应该会失败并出现 "Conditional request failed" 异常.

When you run the below code, first time the put operation should be successful. In the second run, the put operation should fail with "Conditional request failed" exception.

我的电影表同时具有分区键和排序键.所以,我在条件表达式中使用了这两个属性.

My movies table has both partition and sort keys. So, I have used both the attributes in conditional expression.

带条件放置的示例代码:-

var table = "Movies";

var year = 1502;
var title = "The Big New Movie";

var params = {
    TableName:table,
    Item:{
        "yearkey": year,
        "title": title,
        "info":{
            "plot": "Nothing happens at all.",
            "rating": 0
        }
    },
    ConditionExpression: "yearkey <> :yearKeyVal AND #title <>  :title",
    ExpressionAttributeNames: { 
        "#title" : "title" 
     },
    ExpressionAttributeValues: {
        ":yearKeyVal" : year,
        ":title": {"S": title}
    }
};

console.log("Adding a new item...");
docClient.put(params, function(err, data) {
    if (err) {
        console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
    } else {        
        console.log("Added item:", JSON.stringify(data, null, 2));
    }
});

第二次执行put操作时出现异常:-

Unable to add item. Error JSON: {
  "message": "The conditional request failed",
  "code": "ConditionalCheckFailedException",
  "time": "2017-10-02T18:26:26.093Z",
  "requestId": "7ae3b0c4-3872-478d-908c-94bc9492a43a",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 0
}

这篇关于如果条目已存在,如何防止覆盖 DynamoDB 项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆