DynamoDb仅通过主键

时间:2017-11-20 18:34:28

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

我是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(主要排序键)没有在查询本身上定义。

有什么灯吗?我打赌只是一些小细节。

提前致谢

2 个答案:

答案 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,
            }
        };