我正在使用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")))
答案 0 :(得分:0)
ConditionBuilder
具有mode
字段
type ConditionBuilder struct {
operandList []OperandBuilder
conditionList []ConditionBuilder
mode conditionMode
}
mode
的零值为unsetCond
。建立条件时,unsetCond
会引发错误。
case unsetCond:
return exprNode{}, newUnsetParameterError("buildTree", "ConditionBuilder")
在您的代码中,如果queryParam != “param1”
和queryParam != “param2”
,则param1Condition
和param2Condition
是ConditionBuilder的零值,该值在生成时会失败。