任何想法如何从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错过第一查询的随机变量。 这个机会按比例缩小与表扩大,你可以很容易地使用SmallerThan比较在同一个随机密钥,然后确保了随机项的命中发送另一个请求。
如果您Tabledesign不允许随机数RangeKeys你可以按照你的方法,并创建一个单独的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)使用描述表调用此表2中得到N(行的总数))选择一个随机数i介于1和N 3)扫描。 停止,直到你看到我行
我想到一个更好的方式来做到这一点。 当我有一个很好的答案我会更新。
这样做的一个简单有效的方法:
ProjectionExpression
来检索该操作只有您的主分区键。