首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DynamoDb查询AWS DynamoDb?

如何使用DynamoDb查询AWS DynamoDb?
EN

Stack Overflow用户
提问于 2019-05-09 03:49:34
回答 3查看 28.3K关注 0票数 6

我有一个AWS DynamoDb表,

我使用user_id作为索引或GSI(user_id-index ),

我也有product_type作为索引或GSI(prod_type-index )。

我试图使用KeyConditionExpression查询DynamoDb表,

但我得到了-

代码语言:javascript
复制
Validation Exception, with message:"Query key condition not supported" and statusCode: 400
ValidationException: Query key condition not supported\n at Request.extractError 

I表中有以下项结构-

代码语言:javascript
复制
{
  "id": "12345f9f-f08c-45ae-986a-f1b5ac712345",
  "user_id": 1234,
  "prod_type": "OTHER"
}

下面是我查询表-的NodeJs代码

代码语言:javascript
复制
let AWS = require('aws-sdk');

AWS.config.update({
    region: 'us-east-1'
});

let connection = new AWS.DynamoDB.DocumentClient();

let table = "some_table";

let params = {
    IndexName : "user_id-index",
    ExpressionAttributeValues: {
        ":v1": {
            N: 1234
        },
        ":v2": {
            S: "OTHER"
        }
    },
    ExpressionAttributeNames: {
        "#userId": "user_id",
        "#prodType": "prod_type"
    },
    TableName: table,
    KeyConditionExpression: "#userId = :v1 and #prodType = :v2"
};

connection.query(params, function(err, data) {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

参考资料-

Dynamodb查询错误-不支持查询键条件

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-09 07:20:58

正如我在上一个答复中提到的那样。不能将一个GSI/主目录的哈希键和另一个GSI/主目录的哈希键放在单个KeyConditionExpression

该条件必须对单个分区键值执行相等测试。 该条件可以选择对单个排序键值执行多个比较测试之一。这允许查询使用给定的分区键值和排序键值检索一个项,或者检索具有相同分区键值但具有不同排序键值的多个项。

从医生那里

它不是由DynamoDB支持的,它实际上是为了节省你的钱。这里您可以做的是使用更具体的GSI散列键作为KeyConditionExpression,然后您可以对结果集执行FilterExpression。

否则,设置一个GSI,其中一个属性作为哈希键,另一个属性作为范围键。这样,您就可以使用语法进行查询。

代码语言:javascript
复制
partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval

请记住,partitionKeyName只支持相等。sortKeyName支持多个不同的操作

票数 5
EN

Stack Overflow用户

发布于 2019-05-09 04:04:58

根据文档ExpressionAttributeValues,问题是您的这里值是不正确的。您需要提供变量和数据类型与值的映射。您需要提供如下所示的映射:

代码语言:javascript
复制
let params = {
   IndexName : "user_id-index",
   ExpressionAttributeValues: {
      ":v1": {
           N: 1234
       },
       ":v2": {
           S: "OTHER"
       }
   },
   TableName: table,
   KeyConditionExpression: "user_id = :v1 and prod_type = :v2"
};

您需要按照文档指定数据类型。S表示字符串文本,N表示数字等等。您可以在上面的文档中找到详细信息。我还强烈建议您也使用ExpressionAttributeNames。我发现它工作得更好,这是使用这个SDK的最佳实践。您需要替换在KeyConditionExpression中映射中指定的变量,如下所示:

代码语言:javascript
复制
let params = {
   IndexName : "user_id-index",
   ExpressionAttributeValues: {
       ":v1": {
           N: 1234
       },
       ":v2": {
           S: "OTHER"
       }
   },
   ExpressionAttributeNames: {
       "#userId": "user_id",
       "#prodType": "prod_type"
   }
   TableName: table,
   KeyConditionExpression: "#userId = :v1 and #prodType = :v2"
};

参考-

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html

票数 8
EN

Stack Overflow用户

发布于 2020-05-20 16:12:49

与dynamoDb交互有两种不同的方式,您可以使用AWS.DynamoDB (执行一些自定义类型包装,例如作为字符串的包装数字)或为您执行类型包装的AWS.DynamoDB.DocumentClient --后者在大多数情况下使用更简单。

您正在调用DocumentClient,但是使用类型包装,就像直接调用AWS.DynamoDB一样--这将失败

仅仅使用您的user_id索引(我假设它只是一个排序键,并且也不需要一个范围键),这应该有效:

代码语言:javascript
复制
  let params = {
     TableName: table,
     IndexName : "user_id-index",
     KeyConditionExpression: "user_id = :userId",
     ExpressionAttributeValues: { ":userId": 1234 }
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56051891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档