我有一组(〜1.000.000)可以发送消息的设备,每个设备都有一个ID,可以发送多条消息。设备的一个子集(约10.000个)应该可以使用我的服务,并且ID被放入白名单(DynamoDB表)中。 给定恒定的消息流,我只希望白名单中的一次消息保留在DynamoDB表中。
我一直在看的东西如下:
我的问题是DynamoDB中是否存在一些智能方法?
答案 0 :(得分:3)
这既是DynamoDB的福祉又是诅咒-起初是很痛苦的,但是过了一会儿DDB的简单性开始大放异彩-您可以在短时间内学习其整个API。
每个问题都不同,您在问题中已经问了几件事,所以我只提供一些希望对您有帮助的要点:
GetItem
或Query
-换句话说,请不要使用Scan
。答案 1 :(得分:0)
通常,无法通过条件更新来完成所需的操作。有条件的更新只能引用要修改的同一项目的内容,而不能引用其他项目或其他表。这不是一个缺少的功能-这实际上是“免费”无法完成的:在DynamoDB写入项目时,作为同一操作的一部分,DynamoDB可以“免费”检查该项目的先前值。但是,没有“免费”方式读取不同项目。它基本上等于另一读取操作。因此,如果您想阅读其他项目,则可以通过读取操作自己完成此操作-DynamoDB的读取操作实际上无法比额外的读取请求更有效。
在某些情况下,如果每个ID仅保留一个项目,则有一个解决问题的简单方法-只需向该项目添加另一个属性(说明是否已列入白名单),然后在条件更新中使用此新属性即可。但是,如果每个ID包含很多项(例如,该ID是一个分区键,并且您还有一个额外的排序键),则无法执行此操作。 CQL(Cassandra和Scylla)的概念是“静态行”(属于整个分区,而不属于分区内的排序键的项),但DynamoDB不具有此功能。即使这样做,对静态行的额外读取也可能比其他读取便宜,但它不是免费的。