任何想法如何从 DynamoDB 表中随机选择项目/记录?我不相信 API 中对此有任何规定。
我考虑过维护一个 NumericId|MyOtherKey ("NumericIdTable") 表,然后生成一个介于 0 和我拥有的记录总数之间的随机数,然后从 NumericIdTable 获取该项目,但从长远来看它不会起作用。
欢迎提出想法/想法。
任何想法如何从 DynamoDB 表中随机选择项目/记录?我不相信 API 中对此有任何规定。
我考虑过维护一个 NumericId|MyOtherKey ("NumericIdTable") 表,然后生成一个介于 0 和我拥有的记录总数之间的随机数,然后从 NumericIdTable 获取该项目,但从长远来看它不会起作用。
欢迎提出想法/想法。
我想出的一种方法是从 DynamoDB 表中选择一个随机项目:
例如,如果您使用 UUID 作为 RangeKey 的标识符,您可以获得如下所示的随机项目
RandomRangeKey = new UUID
RandomItem = Query( "HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1 )
这样您就可以得到一个随机项目并且只消耗 1 个读取容量。
通过生成比表中使用的最小 UUID 更小的 UUID,有可能错过对随机变量的第一次查询。这个机会随着表的扩大而缩小,您可以使用 SmallerThan 比较在同一个随机键上轻松发送另一个请求,从而确保随机项目的命中。
如果您的 Tabledesign 不允许可随机化的 RangeKey,您可以按照您的方法创建一个单独的 RandomItem 表并将 ID 存储在可随机化的 RangeKey 下。一个可能的表结构是
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
请记住,对于这种方法,您需要管理原始表和随机表之间的冗余。
如果您使用 GUID 作为表的哈希键,则可以执行以下操作:
var client = new AmazonDynamoDBClient();
var lastKeyEvaluated = new Dictionary<string, AttributeValue>()
{
{ "YOUR_HASH_KEY", new AttributeValue(Guid.NewGuid().ToString()) }
};
var request = new ScanRequest()
{
TableName = YOUR_TABLE_NAME,
ExclusiveStartKey = lastKeyEvaluated,
Limit = 1
};
var response = client.Scan(request);
这每次都会给你一个随机记录,因为它会生成一个随机 GUID 作为 lastKeyEvaluated。
天真的方法是 1)使用描述表调用来获取该表中的 N(总行数) 2)在 1 和 N 之间选择一个随机数 i 3)扫描。停下来,直到你看到 i 行
我正在考虑一种更好的方法来做到这一点。当我有一个好的答案时,我会更新。
对于某些用例,我会推荐下一种方法:
创建一个扫描所有 dynamodb 表并将“pk”和“sk”保存到单独文件的脚本。
将 lambda 层中的所有“pk”和“sk”对保存为本地依赖项(如果使用 nodejs,请搜索“package.json 中的本地依赖项”)。
在 lambda 中导入本地依赖项并选择一个随机项。
定期运行脚本以获取本地依赖项中一组令人耳目一新的“pk”和“sk”。
我认为如果您没有非常大的 dynamodb 表并且不需要经常包含新的“pk”和“sk”,这种方法就足够了。
一种简单有效的方法:
ProjectionExpression
用于检索您的主分区键。