1

继续从如何过滤NULL?我正在努力复制 Go 代码以过滤特定列的空值:

import (
        "github.com/apex/log"
        "github.com/aws/aws-sdk-go-v2/aws"
        "github.com/aws/aws-sdk-go-v2/aws/endpoints"
        "github.com/aws/aws-sdk-go-v2/aws/external"
        "github.com/aws/aws-sdk-go-v2/service/dynamodb"
        "github.com/aws/aws-sdk-go-v2/service/dynamodb/expression"
)

// aws --profile dd dynamodb scan --table-name plocal2 --filter-expression 'paymentmethod = :null' --expression-attribute-values '{":null" :{"NULL":true}}'

var table = "plocal2"

func main() {
        cfg, err := external.LoadDefaultAWSConfig(external.WithSharedConfigProfile("dd"))
        if err != nil {
                log.WithError(err).Fatal("setting up credentials")
                return
        }
        cfg.Region = endpoints.ApSoutheast1RegionID
        db := dynamodb.New(cfg)
        filt := expression.Name("paymentmethod").Equal(expression.Value(expression.Null))
        expr, err := expression.NewBuilder().
                WithFilter(filt).
                Build()
        if err != nil {
                log.WithError(err).Error("failed to build expression")
                return
        }
        scanReq := db.ScanRequest(&dynamodb.ScanInput{
                ExpressionAttributeValues: expr.Values(),
                FilterExpression:          expr.Filter(),
                TableName:                 aws.String(table),
        })
        result, err := scanReq.Send()
        if err != nil {
                log.WithError(err).Error("failed to query table")
                return
        }
        log.Infof("%d", len(result.Items))
}

错误是:

2019/04/30 16:59:54 error failed to query table     error=ValidationException: Invalid FilterExpression: An expression attribute name used in the document path
 is not defined; attribute name: #0
        status code: 400, request id: 8CFTOAGVB7M1IM3DC6BFPEVLUNVV4KQNSO5AEMVJF66Q9ASUAAJG

任何提示如何调试这个或我使用表达式生成器出错的地方?

真的希望有例子,因为如果使用MarshalMap,对 NULL 进行过滤对我来说应该是一个非常常见的用例,因为空字符串会变成 NULL!

4

2 回答 2

1

#better-late-than-never,希望能帮助像我一样努力发现使用包过滤 dynamoDB值的秘密的其他人:NULLaws-sdk-go-v2 expression

filt := expression.Name("paymentmethod").
        Equal(expression.Value(&types.AttributeValueMemberNULL{Value: true})
于 2021-10-27T14:37:14.290 回答
0

在 aws-sdk-go (v1) https://github.com/aws/aws-sdk-go/blob/main/service/dynamodb/expression/condition.go#L71

expresion.Null

例子:

const endTsField = "end_ts"
filterNoEndTime := expression.Name(endTsField).AttributeNotExists()
filterNull := expression.Name(endTsField).NotEqual(expression.Value(expression.Null))
filterEndTime := expression.Name(endTsField).GreaterThanEqual(expression.Value(time.Now().UTC().UnixMilli()))
filter := filterNoEndTime.Or(filterEndTime).Or(filterNull)
于 2021-11-09T12:15:17.957 回答