查询不是DynamoDb索引的参数

sr_*_*149 4 go query-parameters amazon-dynamodb aws-sdk

TableName:人

id | 名字| 年龄| 地点

id_1 | A | 23 | 新西兰

id_2 | B | 12 | 印度

id_3 | C | 26 | 新加坡

id_4 | D | 30 | 火鸡

keys:id - > hash和age-> range

问题1

我正在尝试执行一个查询:"从年龄> 25岁的人中选择*"我可以使用"从id = id_1和年龄> 25岁的人中选择年龄"这样的查询,这不是我需要的,只需要选择所有值.

如果我不需要年龄作为范围索引,我应该如何修改我的查询参数只返回符合标准的记录列表:年龄> 25?

问题2

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

是否需要KeyConditions/KeyConditionsExpressions参数?这是否意味着我无法在不属于索引一部分的参数上查询表?

  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))
    }
Run Code Online (Sandbox Code Playgroud)

Jar*_*eld 5

DynamoDB是一个基于NoSQL的系统,因此您无法在不进行表扫描的情况下根据非索引字段上的条件检索所有记录.

表扫描将导致DynamoDB遍历表中的每个记录,对于大表来说,在任何时候(很慢)或金钱(预配读取IOPS)都会非常昂贵.

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

但是要注意的是:如果您打算在一个只有少数(少于100个)前端暴露的物品的桌子上使用扫描操作,您会对结果感到失望.如果这是某种类型的cron作业或后端报告任务,其中响应时间无关紧要,这是一种可接受的方法,但要注意不要耗尽所有IOPS并影响前端应用程序.