使用aws sdk go在Dynamo DB中构建“IN”查询

使用aws sdk go在Dynamo DB中构建“IN”查询,go,amazon-dynamodb,aws-sdk-go,Go,Amazon Dynamodb,Aws Sdk Go,我逐渐了解到,Dynamo DB在提供其他DB类型SQL、mongo、cassandara等方面存在严重限制。。。能力。其中有一些类似于Mongo{attribute:{$in:[…]}}或SQL SELECT中的内容。。。从…起列在哪里。。。。我看到有一个IN运算符,但我正在努力制作一个非常高效的过滤器表达式来搜索,以查看给定列表中是否存在属性值。 例如,如果我有如下数据: ID,Attr1,Attr2 1,abc,hi 2,def,hello 3,ghi,howdy 如果我有一个列表来扫描

我逐渐了解到,Dynamo DB在提供其他DB类型SQL、mongo、cassandara等方面存在严重限制。。。能力。其中有一些类似于Mongo{attribute:{$in:[…]}}或SQL SELECT中的内容。。。从…起列在哪里。。。。我看到有一个IN运算符,但我正在努力制作一个非常高效的过滤器表达式来搜索,以查看给定列表中是否存在属性值。 例如,如果我有如下数据:

ID,Attr1,Attr2
1,abc,hi
2,def,hello
3,ghi,howdy
如果我有一个列表来扫描该表,查找Attr2为[hallo,hi,hola,howdy,bounjour]的项目,它应该返回项目1和3。此列表大小可能并不总是这样;有时可能有更多或更少的元素。 我最终使用了类似于:

filter := expression.Equal(expression.Name("Attr2"), expression.value(myList[0]))
for _, val := range myList[1:] {
  filter = filter.Or(expression.Equal(expression.Name("Attr2"), expression.Value(val)))
}
这似乎是可行的,但我担心表达式变得太长,当我打印出表达式时,它看起来很奇怪,或者语句是嵌套的

{map[filter:((((#0 = :0) OR (#0 = :1)) OR (#0 = :2)) OR (#0 = :3)) OR (#0 = :4) projection:#1, #2, #3, #4, #5, #0, #6] map[#0:0xc0004b06e0 #1:0xc0004b06f0 #2:0xc0004b0700 #3:0xc0004b0710 #4:0xc0004b0720 #5:0xc0004b0730 #6:0xc0004b0740] map[:0:0xc000142500 :1:0xc0001425a0 :2:0xc000142640 :3:0xc0001426e0 :4:0xc000142780]}
我试图使它与条件运算符,但我不能让它与一个未知大小的列表工作。关于让它与具有动态列表的IN操作员一起工作,有什么建议吗?我觉得我的Go代码可能会有所改变,以使其更好。我是围棋新手,有什么建议吗?
在mongo中,能够对照一个大列表进行检查非常简单。SQL也是如此。截至2020年5月,dynamodb中似乎没有合适的方法。

找到了一种使用in运算符的方法:

wordsToCheck := []string{"hallo", "hi", "hola", "howdy", "bounjour"}
y := []*dynamodb.AttributeValue{}
for _, val := range wordsToCheck {
    y = append(y, &dynamodb.AttributeValue{S: aws.String(val)})
}
scanInput := &dynamodb.ScanInput{
    TableName: aws.String("mytable"),
    ScanFilter: map[string]*dynamodb.Condition{
        "Attr2": {
            ComparisonOperator: aws.String("IN"),
            AttributeValueList: y,
        },
    },
}
data, err := dynamoclient.Scan(scanInput)
希望这对别人有帮助!通读AWS文档并不容易