Go 查询不是DynamoDb上的索引的参数
表名:人 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参数?这是否意味着我无法查询不属于索引一部分的参数表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
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,这太完美了!不知道扫描操作的用途。使用本地二级索引可能会有所帮助,但一旦创建它们就无法修改,而且本地二级索引的数量也有限制。