查询条件缺少关键架构元素

问题描述 投票:0回答:1

我有

我有一个 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)
    }


amazon-web-services go amazon-dynamodb
1个回答
0
投票

如果您计划使用created_at索引进行查询并希望对其本身添加条件,则应使用表达式。KeyConditionBuilder,因为条件位于索引的分区键上。

使用表达式的想法。KeyConditionBuilder 是当你想要指定索引/表的键值(分区键/排序键)的条件时。

参考.

© www.soinside.com 2019 - 2024. All rights reserved.