我是DynamoDB的新手(一般没有Sql),我有一些麻烦要理解如何形成一个简单的查询..
我想要执行的是SQL中的一个简单的SELECT FROM
,但似乎我无法完成它。
我的表定义基本上是:
表名称snsNotifications 主分区键recipientId(Number)< ---这是用户ID 主排序键snsID(字符串)< ---这是SNS消息标识
它遵循一些属性(如readAt)。
我想要执行的查询是:
SELECT from snsNotifications WHERE recipientId=X and readAt=x
我甚至可以在AWS UI上执行此查询: Screenshot
我的lambda函数使用以下内容:
var params = {
TableName : "snsNotifications",
KeyConditionExpression : "recipientId = :recipientId and readAt = :readAt",
ExpressionAttributeValues: {
":recipientId": parseInt(msg.recipientId),
":readAt" : 0,
}
};
docClient.query(params, function(err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("Query succeeded.");
data.Items.forEach(function(item) { ... }
但我收到以下错误:
无法查询。错误:{ “message”:“查询条件错过了关键架构元素:snsID”, “code”:“ValidationException”, “时间”:“2017-11-20T18:19:40.419Z”, “requestId”:“J73RIAE09GDRD1Q47I9OLCU7N7VV4KQNSO5AEMVJF66Q9ASUAAJG”, “statusCode”:400, “可重试”:错误, “retryDelay”:44.175697630271316 }
所以基本上它抱怨snsID(主要排序键)没有在查询本身上定义。
有什么灯吗?我打赌只是一些小细节。
提前致谢
答案 0 :(得分:2)
将KeyConditionExpression中的readAt替换为snsId。如果您不想包含排序键并希望通过非键属性readAt过滤数据,请使用FilterExpression。
KeyConditionExpression只能有分区键或排序键。对于非键属性,您应该使用FilterExpression。
答案 1 :(得分:2)
谢谢@notionquest,这就成了伎俩。
对谁可以提供帮助的附加答案:
var params = {
TableName : "snsNotifications",
KeyConditionExpression : "recipientId = :recipientId",
FilterExpression: "readAt = :readAt",
ExpressionAttributeValues: {
":recipientId": parseInt(msg.recipientId),
":readAt" : 0,
}
};