在我的项目中,我想从表中获取所有记录,并按 created_date 降序排序。 另外我想添加获取所有项目的条件而不是 created_by 登录用户。 我尝试了很多方法但却无法实现它。
这是我的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
答案 0 :(得分:1)
简短的回答是,您无法按任何属性按排序顺序从DynamoDB表中获取*所有项目。 DynamoDB不会那样工作。
将DynamoDB视为列表的分布式哈希映射。
就像你不能指望从这样的列表地图获得全局排序结果一样,你也无法从DynamoDB中获取它们。
您可以扫描整个表格,甚至过滤掉一些不需要的结果,但是为了排序,您需要在获取记录后进行排序。
您可以做的是按顺序检索具有相同分区键的项目或排序键。
你可以创建一个索引,你可以选择一个任意属性作为分区键,另一个作为排序键,但即使这种方法也有一些限制。
最好的方法是真正花些时间考虑一下你将如何处理数据。为什么尝试按排序顺序从表中检索所有项目?也许有更好的方法来组织您的数据,这样您就不需要检索所有数据。