如何从DynamoDB表中随机选择项目/记录?我不相信API中有任何规定。
我考虑过维护一个NumericId | MyOtherKey(“NumericIdTable”)表,然后生成一个介于0和我拥有的记录总数之间的随机数,然后从NumericIdTable中获取该项,但它不能在长时间内工作-run。
欢迎思考/想法。
答案 0 :(得分:27)
我想出了一种从DynamoDB表中选择一个随机项的方法:
例如,如果您使用UUID作为RangeKey的标识符,您可以获得随机项,如下所示
RandomRangeKey = new UUID
RandomItem = Query( "HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1 )
这样您就可以得到一个随机项,只消耗1个读取容量。
通过生成比表中使用的最小UUID更小的UUID,有可能错过随机变量的第一个查询。这个机会随着桌子放大而缩小,您可以使用相同随机密钥的SmallerThan Comparison轻松发送另一个请求,然后确保随机项目的命中。
如果您的Tabledesign不允许随机化的RangeKeys,您可以按照您的方法创建一个单独的RandomItem表并将ID存储在可随机化的RangeKey下。可能的表结构是
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId
请记住,对于这种方法,您需要管理原始表和随机化表之间的冗余。
答案 1 :(得分:16)
如果您使用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。
答案 2 :(得分:4)
天真的方式 1)使用describe table调用获取此表中的N(总行数) 2)选择1和N之间的随机数i 3)扫描。停下来,直到你看到我的行
我正在考虑更好的方法来做到这一点。当我得到一个好的答案时,我会更新。
答案 3 :(得分:0)
一种简单有效的方法:
ProjectionExpression
仅检索 主分区密钥。