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

时间:2020-05-14 15:37:37

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

我开始了解到Dynamo DB在提供其他DB类型(SQL,mongo,cassandara等)功能方面受到严重限制。其中之一类似于在Mongo {attribute: {"$in": [...]}}或SQL SELECT ... FROM ... WHERE column IN (...)中。我看到有一个“ 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)))
}

这似乎可行,但是我担心表达式太长,当我打印出表达式时,它看起来很奇怪(OR语句是嵌套的)。

{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”条件运算符来实现它,但是我无法使其在未知大小列表下运行。关于使其与带有动态列表进行检查的“ IN”运算符一起使用的任何建议?我觉得我的Go代码可能会因为做得更好而有所变化。我是一个新手,有什么建议吗? 在mongo中,能够检查大量列表非常简单。与SQL相同。截至目前(2020年5月),dynamodb似乎还没有合适的方法。

1 个答案:

答案 0 :(得分:1)

想出了一种使用“ IN”运算符的方法:

by

希望这对某人有帮助!阅读AWS文档并不容易。