首页 文章

通过排序从dynamoDB中获取项目

提问于
浏览
2

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

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

这是我从dynamoDB获取记录的java代码 .

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

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

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

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

    您可以扫描整个表格,甚至过滤掉一些不需要的结果,但是对于排序,您需要在获取记录后执行此操作 .

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

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

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

相关问题