使用任意值作为 dynamodb 扫描或查询的“ExclusiveStartKey”是否安全?

Is it safe to use arbitrary values as the `ExclusiveStartKey` for a dynamodb scan or query?

ExclusiveStartKey 的 DynamoDB API 参考(对于 ScanQuery),我们有:

The primary key of the first item that this operation will evaluate. Use the value that was returned for LastEvaluatedKey in the previous operation.

我有一个用例,我想使用 ExclusiveStartKey 从特定的已知位置开始扫描(而不是用它来继续现有扫描)。上面第一句话听起来完全没问题,但第二句话就不行了。第二句话让我停顿了一下,因为它不是 "you should [...]" 或 "you must [...]",只是一个没有上下文或解释的普通命令式。

我在 SO 或其他地方找不到以这种方式使用 ExclusiveStartKey 的任何示例。它似乎有效,但 API 参考文献似乎含糊其辞是否违约。我应该寻求不同的路线吗?有没有人在实践中使用过这个并且可以确认它是可靠的?

是的,您应该为此用例使用 ExclusiveStartKey,因为它就是为此而设计的。如果您在第一次调用时不知道从哪里开始(没有 LastEvaluatedKey),那么您可以简单地不包含 ExclusiveStartKey,因为它是可选的。

我认为第二句话非常明确地暗示 "should",他们没有说 "must" 的原因是因为技术上你可以使用任何扫描的密钥,但你可以,并且在在正确扫描所有对象的情况下,应该 使用 LastEvaluatedKey。

DynamoDB 使用散列函数对所有主键进行排序,然后将其存储在正确的存储桶中。扫描文档时,ExclusiveStartKey 用于知道我们应该在哪个存储桶中继续扫描以及该存储桶中的下一个文档是什么。

ExclusiveStartKey 使用任意键是完全安全的,因为即使 DynamoDB 也无法预测它将落在哪个存储桶上。出于同样的原因,它也是无用的,除非你想从数据库中获取随机文档。