首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >亚马逊网络服务DynamoDB -随机挑选一条记录/项目?

亚马逊网络服务DynamoDB -随机挑选一条记录/项目?
EN

Stack Overflow用户
提问于 2012-05-19 23:09:19
回答 5查看 16.7K关注 0票数 43

你知道如何从DynamoDB表中随机选择一项/记录吗?我不相信API中有任何关于这方面的规定。

我想过维护一个包含NumericId|MyOtherKey (" NumericIdTable ")的表,然后生成一个介于0和我拥有的记录总数之间的随机数,然后从NumericIdTable获取该项目,但从长期来看这是行不通的。

欢迎有想法/想法。

EN

回答 5

Stack Overflow用户

发布于 2012-05-21 07:45:46

我想出了一种从DynamoDB表中随机挑选项目的方法:

  1. 在表中所有可能的RangeKey上生成随机RangeKeys
  2. 使用此RangeKey和RangeKeyCondition GreaterThan查询表,并限制为1

例如,如果您使用UUID作为RangeKey的标识符,则可以获得随机项,如下所示

代码语言:javascript
复制
RandomRangeKey = new UUID
RandomItem = Query( "HashKeyValue": "KeyOfRandomItems",
                    "RangeKeyCondition": { "AttributeValueList":
                                "RandomRangeKey",
                                "ComparisonOperator":"GT"}, 
                    "Limit": 1 )

这样,您将获得一个随机项目,并且只占用1个读取容量。

由于生成的UUID比表中使用的最小UUID小,因此有可能错过对随机变量的第一次查询。这种机会随着表的扩展而缩小,您可以很容易地使用相同随机键上的SmallerThan比较发送另一个请求,从而确保随机项的命中。

如果您的表设计不允许随机化的RangeKeys,您可以按照您的方法创建一个单独的RandomItem表,并将ID存储在一个随机化的RangeKey下。一种可能的表结构是

代码语言:javascript
复制
*RandomItemTable
   TableName - HashKey
   UUID - Rangekey
   ItemId

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

票数 34
EN

Stack Overflow用户

发布于 2014-12-10 05:43:43

如果您使用GUID作为表的散列键,则可以执行以下操作:

代码语言:javascript
复制
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。

票数 29
EN

Stack Overflow用户

发布于 2014-06-20 11:36:04

简单方法是1)使用describe table调用来获取该表中的N(总行数) 2)选择1到N之间的随机数i 3)扫描。停止,直到您看到i行

我在想一种更好的方法来做这件事。当我有一个好的答案时,我会更新的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10666364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档