【问题标题】:DynamoDB multiple filter conditions, gives error - buildTree error: unset parameter: ConditionBuilderDynamoDB 多个过滤条件,给出错误 - buildTree 错误:未设置参数:ConditionBuilder
【发布时间】:2019-08-16 10:13:02
【问题描述】:

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

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

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

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

AWS SDK for Go - DynamoDb - Add multiple conditions to FilterExpression

但是当我调用该函数时,我在日志中得到以下错误。-

buildTree 错误:未设置参数:ConditionBuilder

过滤器表达式未应用,扫描返回所有结果。

这里是代码sn-p。

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")))

【问题讨论】:

  • param1Conditionparam2Condition 的零值是多少?

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


【解决方案1】:

ConditionBuildermode 字段

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 的零值,构建失败。

【讨论】:

  • 在我的情况下,我有多个条件,6. 最终用户可以指定任意数量的条件(0 到 6)。所以有些条件可能没有任何值。有没有办法,我们仍然可以添加一个没有任何价值的条件?
猜你喜欢
  • 2021-12-27
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多