我有
我有一个 dynamodb 表,其中分区键为 id,并且我也有 GSI 作为 transaction_id 我想为created_at字段创建新的GSI,以使用之间运算符进行新查询。 在构建查询时,我应该在运算符之间添加此作为
expression.KeyConditionBuilder
或
expression.ConditionBuilder
谢谢您的回答
这是我对数据库客户端的实现:
var keyCondBuilder expression.KeyConditionBuilder
keyCondition.ForEach(func(key string, value db.ConditionValue) {
if value.Operation == db.ConditionOperationEqual {
if keyCondBuilder.IsSet() {
keyCondBuilder = keyCondBuilder.And(expression.Key(key).Equal(expression.Value(value.Value)))
} else {
keyCondBuilder = expression.Key(key).Equal(expression.Value(value.Value))
}
} else if value.Operation == db.ConditionOperationBetween {
if len(value.BetweenValues) != 2 {
errors.New("between operation requires two values")
}
if keyCondBuilder.IsSet() {
keyCondBuilder = keyCondBuilder.And(expression.Key(key).Between(expression.Value(value.BetweenValues[0]), expression.Value(value.BetweenValues[1])))
} else {
keyCondBuilder = expression.Key(key).Between(expression.Value(value.BetweenValues[0]), expression.Value(value.BetweenValues[1]))
}
}
})
builder := expression.NewBuilder().WithKeyCondition(keyCondBuilder)
var filterCondBuilder expression.ConditionBuilder
if filterCondition != nil {
filterCondition.ForEach(func(key string, value db.ConditionValue) {
if value.Operation == db.ConditionOperationEqual {
if filterCondBuilder.IsSet() {
filterCondBuilder = filterCondBuilder.And(expression.Name(key).Equal(expression.Value(value.Value)))
} else {
filterCondBuilder = expression.Name(key).Equal(expression.Value(value.Value))
}
} else if value.Operation == db.ConditionOperationBetween {
if len(value.BetweenValues) != 2 {
errors.New("for BETWEEN operation, exactly two values are required")
}
if filterCondBuilder.IsSet() {
filterCondBuilder = filterCondBuilder.And(expression.Name(key).Between(expression.Value(value.BetweenValues[0]), expression.Value(value.BetweenValues[1])))
} else {
filterCondBuilder = expression.Name(key).Between(expression.Value(value.BetweenValues[0]), expression.Value(value.BetweenValues[1]))
}
}
})
builder = builder.WithFilter(filterCondBuilder)
}
expr, err := builder.Build()
if err != nil {
return fmt.Errorf("got error when building expression: %v", err)
}
params := &dynamodb.QueryInput{
ExpressionAttributeNames: expr.Names(),
ExpressionAttributeValues: expr.Values(),
FilterExpression: expr.Filter(),
ProjectionExpression: expr.Projection(),
KeyConditionExpression: expr.KeyCondition(),
TableName: dbClient.TableName(),
IndexName: indexName,
ConsistentRead: consistentRead,
}
result, err := dbClient.svc.Query(ctx, params)
if err != nil {
return fmt.Errorf("got error calling Query: %s", err)
}
如果您计划使用created_at索引进行查询并希望对其本身添加条件,则应使用表达式。KeyConditionBuilder,因为条件位于索引的分区键上。
使用表达式的想法。KeyConditionBuilder 是当你想要指定索引/表的键值(分区键/排序键)的条件时。
参考.