主排序键DynamoDB属性表达式

时间:2016-02-29 18:21:43

标签: expression amazon-dynamodb

我是DynamoDB的新用户,如果主要排序键(名称)不存在两次,则只想创建一个新对象。我试过这样的话:

params.id = randomId();

        var item = {
            TableName: tableName,
            Item: params,
            ConditionExpression: "#na <> :n",
            ExpressionAttributeNames:{"#na":"name"},
            ExpressionAttributeValues:{
                ":n":params.name
            }
        };

        docClient.put(item, function(err, data) {
            console.log("Data:", data);
            console.log("Err:", err);
        });

但仍然创建了该项:/甚至可以在主排序键上创建条件表达式吗?

2 个答案:

答案 0 :(得分:0)

实际上我自己遇到了这个问题,as explained here看起来你不能,你必须使用Global Secondary Index作为'sort'键。

您必须首先在GSI上执行单独的get请求,以查看是否存在“name”。

function checkNameDoesNotExist(name, fn){

    query.IndexName = 'nameInUsers';
    query.KeyConditionExpression = 'name = :n';
    query.ExpressionAttributeValues = {
        ':n': name
    };

    dynamodb.query(query, function(err, data){
        if (err) {
            return fn(err);
        } else {
            fn(null, data);
        }
    });
}

免责声明:将代码写在我的头顶,不知道它是否有效,但应该给你一个很好的起点

答案 1 :(得分:0)

您可以使用存在条件。它将返回一个错误,指出该对象已存在

var item = {
    TableName: tableName,
    Item: params,
    Expected: {
    name: {
      Exists: false
    }
};

docClient.put(item, function(err, data) {
    console.log("Data:", data);
    console.log("Err:", err);
});