向AWS DynamoDB添加where子句

时间:2016-10-31 08:14:02

标签: amazon-web-services amazon-dynamodb aws-lambda aws-sdk nosql

我正在尝试在AWS Lambda中创建一个getItem请求来访问DynamoDB,如下所示:

dynamodb.getItem({
    TableName: "DataTable",
    Key: {
        user: {
            S: user
        },
        deleted: {
            BOOL: false
        }
    }
}, function(err, data) {
    if (err) return fn(err);
    else {
        if ('Item' in data) {
            fn(null, user);
        } else {
            fn(null, null); // User not found
        }
    }
});

当我传入用户时它工作正常,因为那是桌面上的主键。我添加了一个删除的布尔值来为用户创建一个软删除。但我补充说,在架构错误开始发生,因为删除不是主键的一部分。我想要一种方法将它添加为来自关系数据库世界的where子句。这是怎么做到的?谢谢。 :O)

1 个答案:

答案 0 :(得分:1)

如果必须使用任何非关键属性过滤数据,则无法使用getItem

我认为在上述情况下,'deleted'属性是非关键属性。因此,应使用查询API 来过滤数据以及键属性。

请参阅以下示例中的 FilterExpression

FilterExpression:'已删除=:createdate'

  

(AWS.Request)查询(params = {},回调)

示例代码: -

var params = {
    TableName : table,
    KeyConditionExpression : 'yearkey = :hkey and title = :rkey',
    FilterExpression : 'deleted = :deleted',
    ExpressionAttributeValues : {
        ':hkey' : year_val,
        ':rkey' : title,
        ':deleted' : {BOOL : false}
    }
};

docClient.query(params, function(err, data) {
    if (err) {
        console.error("Unable to read item. Error JSON:", JSON.stringify(err,
                null, 2));
    } else {
        console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
    }
});

对于您的用例,密钥,过滤条件和表达式属性值应如下所述: -

KeyConditionExpression : 'user = :user',
FilterExpression : 'deleted = :deleted',
ExpressionAttributeValues : {
     ':user' : 'John',
     ':deleted' : {BOOL : false}
}