我正在尝试在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)
答案 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}
}