簡體   English   中英

帶有ConditionExpression的DynamoDb

[英]DynamoDb with ConditionExpression

請考慮以下DynamoDb表:

TableName: foo-bar HashKey: Foo, str RangeKey: Bar, str Name: Baz, str

現在有了vogels API,我試圖插入一個帶有HashKey,一個新的RangeKey和一個Name的項目。

但是對於給定的HashKey,名稱不能存在:

所以我們定義了vogels API的表格布局:

var foobar = vogels.define("foo-bar", {
    tableName: "foo-bar",
    hashKey: "foo",
    rangeKey: "bar",
    schema: {
        "foo": Joi.string(),
        "bar": Joi.string(),
        "name": Joi.string()
    }
});

然后插入項目:

var itemToInsert = { foo: "foo", bar: "bar2", name: "TEST" };

var params = {};
params.ConditionExpression = "foo <> :foo AND name <> :name";
params.ExpressionAttributeValues = {
    ":foo": itemToInsert.foo,
    ":name": itemToInsert.name
};

foobar
    .create(itemToInsert, params, function(error, data) {
        if(error) {
            console.log(error);
        }
        else {
            console.log(data);
        }
});

表中已有一個項目具有以下值: {foo: "foo", bar: "bar", name: "TEST" }

所以我期待系統給我一個錯誤,因為已經有一個匹配因為ConditionExpression ,但是插入的項目沒有問題。 這對DynamoDb不可能嗎?

請注意,無論我是使用vogels還是直接使用aws-sdk,它們都有相同的問題,即插入項目並且ConditionExpression不會阻止插入。

DynamoDB插入項目的原因是因為您的表使用了hashkey的復合鍵:foo,rangekey:bar。 您正在嘗試插入具有不同鍵的項目,在本例中為hashkey:foo,rangekey:bar2。 在DynamoDB中,插入項時,條件表達式僅針對與完全相同的散列和范圍鍵匹配的現有項進行測試。

您正在嘗試在非鍵屬性上添加唯一約束,目前這可能不適用於DynamoDB,並且需要更改架構才能強制執行此約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM