查询不是 DynamoDb 上的索引的参数

Querying a parameter that’s not an index on DynamoDb

表名:人

编号 |姓名 |年龄 |位置

id_1 |一个| 23 |新西兰

id_2 |乙 | 12 |印度

id_3 |丙 | 26 |新加坡

id_4 | D | 30 |土耳其

keys: id -> hash and age->range

问题一

我正在尝试执行查询:“Select * 来自年龄 > 25 岁的人” 我可以使用它来处理诸如“Select 来自 id = id_1 且年龄 > 25 的人的年龄”之类的查询,这不是我需要的,只需要 select 所有值。

如果我不需要将年龄作为范围索引,我应该如何将查询参数修改为 return 符合以下条件的记录列表:年龄 > 25?

问题二

AWS 在注释第 23 行或第 24-41 行时抛出错误。 :查询错误:ValidationException:必须在请求中指定 KeyConditions 或 KeyConditionExpression 参数。 状态码:400,请求id:[]

是否需要KeyConditions/KeyConditionsExpressions参数?这是否意味着我不能在不属于索引的参数上查询 table?

  func queryDynamo() {
        log.Println("Enter queryDynamo")

        svc := dynamodb.New(nil)

        params := &dynamodb.QueryInput{
            TableName: aws.String("people"), // Required
            Limit:     aws.Long(3),
            // IndexName: aws.String("localSecondaryIndex"),
            ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
                ":v_age": { // Required
                    N: aws.String("25"),
                },
                ":v_ID": {
                    S: aws.String("NULL"),
                },
            },
            FilterExpression: aws.String("age >= :v_age"),

            // KeyConditionExpression: aws.String("id = :v_ID and age >= :v_age"),
            KeyConditions: map[string]*dynamodb.Condition{
                "age": { // Required
                    ComparisonOperator: aws.String("GT"), // Required
                    AttributeValueList: []*dynamodb.AttributeValue{
                        { // Required
                            N: aws.String("25"),
                        },
                        // More values...
                    },
                },
                "id": { // Required
                    ComparisonOperator: aws.String("EQ"), // Required
                    // AttributeValueList: []*dynamodb.AttributeValue{
                    //  S: aws.String("NOT_NULL"),
                    // },
                },
                // More values...
            },
            Select:           aws.String("ALL_ATTRIBUTES"),
            ScanIndexForward: aws.Boolean(true),
        }

//Get the response and print it out.
        resp, err := svc.Query(params) 

        if err != nil {
            log.Println("Query Error: ", err.Error())
        }

        // Pretty-print the response data.
        log.Println(awsutil.StringValue(resp))
    }

DynamoDB 是一个基于 NoSQL 的系统,因此如果不执行 table scan.

,您将无法根据非索引字段上的条件检索所有记录

A table 扫描将导致 DynamoDB 遍历 table 中的每条记录,对于大的 table 这两种情况都非常昂贵(很慢)或金钱(规定的读取 IOPS)。

使用过滤器是正确的方法,如果您从查询切换到扫描,将允许操作完成。查询必须始终指定哈希键。

不过要提醒一句:如果您计划对 table 多个(少于 100 个)暴露在前端的项目使用扫描操作你会对结果感到失望。如果这是某种类型的 cron 作业或后端报告任务,其中响应时间无关紧要,这是一种可接受的方法table,但请注意不要耗尽所有 IOPS 并影响前端应用程序。