通过排序从dynamoDB中获取项目

时间:2018-04-05 07:10:35

标签: android database sorting amazon-dynamodb

在我的项目中,我想从表中获取所有记录,并按 created_date 降序排序。 另外我想添加获取所有项目的条件而不是 created_by 登录用户。 我尝试了很多方法但却无法实现它。

下面是我的表格结构。 dynamodb table structure

这是我的java代码,用于从dynamoDB中获取记录。

Map<String, Condition> filter = new HashMap<String, Condition>();
//filter.put(RealmConstant.Expo.created_by, new Condition().withComparisonOperator(ComparisonOperator.NE).withAttributeValueList(new AttributeValue().withS(userId)));
filter.put(RealmConstant.Expo.created_date, new Condition().withComparisonOperator(ComparisonOperator.LE.toString()).withAttributeValueList(new AttributeValue().withS(""+new Date())));

Expo expo =new Expo();
expo.setCreated_by(userId);

DynamoDBQueryExpression<Expo> queryExpression = new DynamoDBQueryExpression<Expo>();
queryExpression.setHashKeyValues(expo);
queryExpression.setIndexName(AppConstant.DynamoDBTableIndex.created_by_created_date_index);
queryExpression.setConsistentRead(false);
queryExpression.setRangeKeyConditions(filter);

queryExpression.setScanIndexForward(false);
return mapper.query(Expo.class, queryExpression);

按照上面的代码,我只获得了由我创建的所有记录。我想获取非我创建的所有记录。

还尝试.withFilterExpression("created_by <> :val1").withExpressionAttributeValues(eav);但没有工作。已经发布了问题。 Why is there no **not equal** comparison in DynamoDB queries?

DynamoDB: Filter Expression can only contain non-primary key attributes

1 个答案:

答案 0 :(得分:1)

简短的回答是,您无法按任何属性按排序顺序从DynamoDB表中获取*所有项目。 DynamoDB不会那样工作。

将DynamoDB视为列表的分布式哈希映射。

就像你不能指望从这样的列表地图获得全局排序结果一样,你也无法从DynamoDB中获取它们。

您可以扫描整个表格,甚至过滤掉一些不需要的结果,但是为了排序,您需要在获取记录后进行排序。

您可以做的是按顺序检索具有相同分区键的项目或排序键。

你可以创建一个索引,你可以选择一个任意属性作为分区键,另一个作为排序键,但即使这种方法也有一些限制。

最好的方法是真正花些时间考虑一下你将如何处理数据。为什么尝试按排序顺序从表中检索所有项目?也许有更好的方法来组织您的数据,这样您就不需要检索所有数据。