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

Go 查询不是DynamoDb上的索引的参数,go,amazon-dynamodb,aws-sdk,query-parameters,Go,Amazon Dynamodb,Aws Sdk,Query Parameters,表名:人 id |姓名|年龄|位置 id|u 1 | A | 23 |新西兰 印度id|u 2 | B | 12 | id|U 3 | C | 26 |新加坡 id|U 4 | D | 30 |土耳其 关键字:id->哈希和年龄->范围 问题1 我正在尝试执行一个查询:“从年龄>25岁的人中选择*” 我可以让它工作查询,如“从id=id_1和年龄>25的人中选择年龄”,这不是我需要的,只需要选择所有值 如果我不需要年龄作为范围索引,我应该如何修改我的查询参数,只返回符合条件的记录列表:年龄>25

表名:人

id |姓名|年龄|位置

id|u 1 | A | 23 |新西兰

印度id|u 2 | B | 12 |

id|U 3 | C | 26 |新加坡

id|U 4 | D | 30 |土耳其

关键字:id->哈希和年龄->范围

问题1

我正在尝试执行一个查询:“从年龄>25岁的人中选择*” 我可以让它工作查询,如“从id=id_1和年龄>25的人中选择年龄”,这不是我需要的,只需要选择所有值

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

问题2

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

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

  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的系统,因此,如果不执行以下操作,您将无法基于非索引字段上的条件检索所有记录

表扫描将导致DynamoDB遍历表中的每一条记录,对于一个大表来说,无论是速度慢还是金钱配置的读取IOPS,这都是非常昂贵的

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


不过,有一点需要提醒:如果你计划对一张在前端暴露的不到100项的表格进行扫描操作,那么你会对结果感到失望。如果这是响应时间无关紧要的某种类型的cron作业或后端报告任务,这是一种可接受的方法,但请注意不要耗尽所有IOPS并影响前端应用程序。

谢谢JaredHatfield,这太完美了!不知道扫描操作的用途。使用本地二级索引可能会有所帮助,但一旦创建它们就无法修改,而且本地二级索引的数量也有限制。