Несколько фильтров условия DynamoDB, выдает ошибку - ошибка buildTree: неустановленный параметр: ConditionBuilder - PullRequest
0 голосов
/ 26 марта 2019

Я создаю REST API, используя Lambda и DynamoDB в GO.

Мне нужно запросить данные на основе нескольких фильтров.

Количество фильтров может варьироваться в зависимости от количества параметров запроса, предоставленных пользователем при вызове REST API.

Согласно приведенному ниже сообщению, я разработал код для добавления нескольких условий.

AWS SDK для Go - DynamoDb - Добавить несколько условий в FilterExpression

Но когда я вызываю функцию, я получаю ошибку ниже, в журналах.

Ошибка buildTree: не задан параметр: ConditionBuilder

Выражение фильтра не применяется, и сканирование возвращает все результаты.

Вот фрагмент кода.

for queryParam, queryParamValue := range searchParams {
        fmt.Println("queryParam:", queryParam, "=>", "queryParamValue:", queryParamValue)
        if queryParam == “param1” {
            param1Condition = expression.Name(“param1”).Equal(expression.Value(queryParamValue))
        }

        if queryParam == “param2” {
            param2Condition = expression.Name(“param2”).Equal(expression.Value(queryParamValue))
        }   
    }


sampleExpr, errSample := expression.NewBuilder().
        WithCondition(param1Condition.Or(param2Condition)).
        Build()
    if errSample != nil {
        fmt.Println("Error in building Sample Expr ", errSample)
    } else {
        fmt.Println("sampleExpr ", sampleExpr)
    }

    input := &dynamodb.ScanInput{
        ExpressionAttributeNames:  sampleExpr.Names(),
        ExpressionAttributeValues: sampleExpr.Values(),
        FilterExpression:          sampleExpr.Filter(),
        TableName:                 aws.String(deviceInfotable),
    }

Но если я создаю выражение по-другому, оно работает.

filt := expression.Name("param1").Equal(expression.Value("valu1")).Or(expression.Name("param2").Equal(expression.Value("value2")))

1 Ответ

0 голосов
/ 26 марта 2019

ConditionBuilder имеет mode поле

type ConditionBuilder struct {
    operandList   []OperandBuilder
    conditionList []ConditionBuilder
    mode          conditionMode
}

Нулевое значение mode равно unsetCond. Когда условие сборки, unsetCond вызывает ошибку.

https://github.com/aws/aws-sdk-go/blob/7798c2e0edc02ba058f7672d32f4ebf6603b5fc6/service/dynamodb/expression/condition.go#L1415

case unsetCond:
        return exprNode{}, newUnsetParameterError("buildTree", "ConditionBuilder")

В вашем коде, если queryParam != “param1” и queryParam != “param2”, param1Condition и param2Condition - это нулевое значение ConditionBuilder, которое не выполняется при сборке.

...