查询不是 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 并影响前端应用程序。
表名:人
编号 |姓名 |年龄 |位置
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 并影响前端应用程序。