AWS DynamoDB - 随机挑选一个记录/项目?(AWS DynamoDB - Pick a

2019-06-24 14:29发布

任何想法如何从DynamoDB表中选择一个项目/记录随机? 我不相信有API中这方面的任何规定。

我想到了保持NumericId的表| MyOtherKey(“NumericIdTable”),然后生成介于0和总记录数我有一个随机数,然后让从NumericIdTable该项目,但它不会在长期的工作。

思考/想法表示欢迎。

Answer 1:

一种方法我想出了从DynamoDB表选择一个随机项:

  1. 产生超过表中的所有可能的RangeKeys随机RangeKey
  2. 查询该表与此RangeKey和RangeKeyCondition GREATERTHAN和1限价

例如,如果您使用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

请记住,这种方法需要管理原始表和随机表之间的冗余。



Answer 2:

如果您使用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。



Answer 3:

用简单的方式将是1)使用描述表调用此表2中得到N(行的总数))选择一个随机数i介于1和N 3)扫描。 停止,直到你看到我行

我想到一个更好的方式来做到这一点。 当我有一个很好的答案我会更新。



Answer 4:

这样做的一个简单有效的方法:

  1. 检索表中的所有项目。 由于DynamoDB具有获取数据的只有1MB的限制,使用ProjectionExpression来检索该操作只有您的主分区键。
  2. 从上面的结果,你会得到物品的总数。 现在,只需生成介于0和项目数的随机数。 让我们把这个随机数,N。
  3. 从结果中1,取这将是随机的项目的主分区键值的第n个项。
  4. 跟你刚才计算的随机项目的主分区键值另一DynamoDB查询,以获得所有必要的列值。


文章来源: AWS DynamoDB - Pick a record/item randomly?