当前位置: 首页 > 知识库问答 >
问题:

仅按主键进行DynamoDb查询

哈襦宗
2023-03-14

我对DynamoDB非常陌生(一般没有Sql),在理解如何形成一个简单的查询时遇到了一些困难。。

我想在SQL中执行一个简单的选择,但似乎无法完成。

我的表定义基本上是:

表名snsNotiations主分区密钥接收者ID(编号)

它遵循一些属性(如readAt)。

我要执行的查询是:

SELECT from snsNotifications WHERE recipientId=X and readAt=x

我甚至可以在AWS UI上执行此查询:截图

我的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) { ... }

但我得到以下错误:

无法查询。错误:{"消息":"查询条件遗漏键模式元素: snsID","code":"ValidationException","time":"2017-11-20T18:19:40.419Z","Request estId":"J73RIAE09GDRD1Q47I9OLCU7N7V4KQNSO5AEMVJF66Q9ASUAAJG","statusCode": 400,"retryable": false,"retryDelay":44.175697630271316}

因此,它基本上是在抱怨没有在查询本身上定义snsID(主排序键)。

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

提前谢谢

共有2个答案

吴高畅
2023-03-14

谢谢你@ConceptQuest,成功了。

随附的对谁有帮助的答复:

var params = {
            TableName : "snsNotifications",
            KeyConditionExpression   : "recipientId = :recipientId",
            FilterExpression: "readAt = :readAt",
            ExpressionAttributeValues: {
                ":recipientId": parseInt(msg.recipientId),
                ":readAt"     : 0,
            }
        };
融唯
2023-03-14

用snsId替换KeyConditionExpression中的readAt。如果不希望包含排序键,并且希望按非键属性readAt过滤数据,请对其使用FilterExpression。

KeyConditionExpression只能有分区键或排序键。对于非键属性,应该使用FilterExpression。

 类似资料:
  • 嗨,Dynamodb社区, 因此,所讨论的表是MLA_USER_AUTH。正如您所看到的,它有As分区键和As排序键。我希望能够使用用户id和电子邮件查询数据库。 有时我需要查找与电子邮件关联的用户,有时还需要查找用户ID。电子邮件和用户ID属性对于每个访问者都是唯一的。有什么办法可以做到吗? 这是我目前的查询。这显然行不通。当它抛出错误时:ValidationExc0019:查询条件错过了关键架

  • 我试图查询具有分区键和排序键的表(但是分区键和排序键是1:1,我只想使用分区键[仅返回一项]进行查询)。 这是我尝试过的代码,但没有成功(testId是分区键名,1234567890是字符串形式的分区键值);你们都知道我可以只使用分区键进行查询的方法吗?记住,由于分区键和排序键是1:1,所以只会返回一个项?提前非常感谢您。[这是我的第一篇堆栈溢出帖子-很抱歉,如果我用词不当,我很乐意回答关于我的措

  • 我是DynamoDB的新手,想知道我们如何通过在JAVA中使用ONLY分区键来查询DynamoDB中的表 我有一个名为“ervive pdi data invalid qa”的表,其模式是: 分区键为SubmissionId 排序键是id。 城市(属性) 错误(属性) 这张桌子看起来像这样:桌子 我想通过使用(software.amazon.awssdk)新版本的AWS SDK DynamoDB类

  • 根据此链接: DynamoDB上支持的操作 “只能查询具有复合主键(分区键和排序键)的表。” 但这似乎并不正确。我在DynamoDB中有一个名为“users”的表,该表的主键只包含一个属性“username”。 而且我能够在NodeJS中仅使用“username”属性上的“KeyConditionExpression”查询该表。请参见以下内容: } 这段代码运行得很好。所以我想知道文档是否有误,或

  • 假设我有一个DynamoDB表: UserId是主键(hash),我需要将BookName设置为排序键(range),因为添加到数据库中的另一项用相同的UserId覆盖了前面的项。

  • 我正在寻找优化Dynamodb操作,即删除扫描和使用查询快速获取数据。 表数据: 我必须使用项目名称进行项目搜索。现在,我们扫描整张桌子。 然后,如果itemOwners包含搜索用户的用户ID,我们将过滤items结果。 我想知道是否有更好的方法使用dynamodb进行搜索查询?