DynamoDB多个过滤条件,给出错误-buildTree错误:未设置参数:ConditionBuilder

时间:2019-03-26 05:06:34

标签: amazon-web-services go amazon-dynamodb aws-sdk-go

我正在使用GO中的Lambda和DynamoDB构建REST API。

我需要基于多个过滤器查询数据。

过滤器的数量可以根据用户在调用REST API时提供的查询参数的数量而变化。

根据下面的文章,我已经开发了添加多个条件的代码。

AWS SDK for Go - DynamoDb - Add multiple conditions to 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 :(得分:0)

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”,则param1Conditionparam2Condition是ConditionBuilder的零值,该值在生成时会失败。