Android 消除Dynamo更新查询的范围键条件?
我怎样才能让Dynamo的UpdateItemRequest忽略范围键,或者做一个粗略的测试,比如NOTNULL 我使用的是一个包含记录更新时间的范围键。另外,我使用不是键的ID字段更新所选的行。我使用UpdateItemRequest中的expectedAttribute更新ID字段。Dynamo的UpdateItemRequest强制我指定一个范围键值。我的ID更新代码将不知道范围键值。我是否可以不指定范围键而不获得错误?或者我可以提供一个简单的范围键测试,比如NOTNULL吗 当我删除范围键时,AWS抛出一个错误,“提供的键元素与架构不匹配”Android 消除Dynamo更新查询的范围键条件?,android,amazon-web-services,amazon-dynamodb,Android,Amazon Web Services,Amazon Dynamodb,我怎样才能让Dynamo的UpdateItemRequest忽略范围键,或者做一个粗略的测试,比如NOTNULL 我使用的是一个包含记录更新时间的范围键。另外,我使用不是键的ID字段更新所选的行。我使用UpdateItemRequest中的expectedAttribute更新ID字段。Dynamo的UpdateItemRequest强制我指定一个范围键值。我的ID更新代码将不知道范围键值。我是否可以不指定范围键而不获得错误?或者我可以提供一个简单的范围键测试,比如NOTNULL吗 当我删除范围
//构建更新映射
HashMap updates=新建HashMap();
AttributeValue av=新的AttributeValue(),带n(“1”);
AttributeValueUpdate avu=新的AttributeValueUpdate().withValue(av).withAction(AttributeAction.PUT);
更新。放置(“第1列”,avu);
AttributeValue av2=新的AttributeValue(),带n(“2”);
AttributeValueUpdate avu2=新的AttributeValueUpdate().withValue(av2).withAction(
定语从句;
更新.put(“Column2”,avu2);
//构建关键地图
HashMap keyMap=新HashMap();
AttributeValue hashValue=新的AttributeValue(),带n(“10”);
keyMap.put(“hashKey”,hashValue);
AttributeValue lastModKeyValue=新的AttributeValue(),带n(“1404175127074”);
//******我想取下这把钥匙,但迪纳摩出错了
放置(“problemRangeKey”,lastModKeyValue);
//期望值比较
AttributeValue idValue=新的AttributeValue(),带n(“100”);
ExpectedAttributeValue expected=新的ExpectedAttributeValue(idValue);
UpdateItemRequest request=new UpdateItemRequest().withTableName(DatabaseConstants.CHART\u TABLE)
.withKey(键映射)。WithAttributeUpdate(更新)。addExpectedEntry(ID,预期值);
ddb.updateItem(请求);
为清楚起见,以下是如何使用range键在特定时间后查找行。如果我删除这个时间范围,那么每次我都会进行一次大扫描,以在特定时间后查找行
Map keyConditions = new HashMap();
AttributeValue attribute = new AttributeValue().withN("10");
Condition hashKeyCondition = new Condition().withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(attribute);
keyConditions.put("hashKey", hashKeyCondition);
// specify new records
long lastQueryTime = PrefsActivity.getLastDynamoQueryTime(activity);
String lastTimeString = String.valueOf(lastQueryTime);
Log.v(TAG, "get Charts from dynamo that are after " + lastTimeString);
// update the query time to now
long now = System.currentTimeMillis();
PrefsActivity.setLastDynamoQueryTime(activity, now);
AttributeValue timeAttribute = new AttributeValue().withN(lastTimeString);
Condition timeCondition = new Condition().withComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(timeAttribute);
keyConditions.put("problemRangeKey", timeCondition);
List<Map<String, AttributeValue>> ChartsInMaps = new ArrayList<Map<String, AttributeValue>>();
Map lastEvaluatedKey = null;
QueryRequest request = new QueryRequest().withTableName("tableName")
.withKeyConditions(keyConditions).withExclusiveStartKey(lastEvaluatedKey);
QueryResult result = ddb.query(request);
Map keyConditions=newhashmap();
AttributeValue属性=新的AttributeValue();
Condition hashKeyCondition=new Condition()。withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(属性);
keyConditions.put(“hashKey”,hashKeyCondition);
//指定新记录
long lastQueryTime=PrefsActivity.getLastDynamoQueryTime(活动);
String lastTimeString=String.valueOf(lastQueryTime);
Log.v(标记“从dynamo获取在“+lastTimeString”之后的图表);
//将查询时间更新到现在
long now=System.currentTimeMillis();
setLastDynamoQueryTime(活动,现在);
AttributeValue timeAttribute=新的AttributeValue().withN(lastTimeString);
Condition timeCondition=new Condition()。带有ComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(时间属性);
keyConditions.put(“problemRangeKey”,timeCondition);
List ChartsInMaps=new ArrayList();
Map lastEvaluatedKey=null;
QueryRequest请求=新建QueryRequest()。带有tableName(“tableName”)
.withKeyConditions(keyConditions)。withExclusiveStartKey(lastEvaluatedKey);
QueryResult result=ddb.query(请求);
我正在使用最新的AWS Android SDK。在上面的示例中,我将hashKey设置为“10”。实际上,情况会有所不同
提前感谢您的帮助
Jeff问题是,您想用特定的hashKey值和特定的列值(列名是id)更新所有项目 该表是哈希范围架构。由于不知道range键,因此必须使用该hashKey获取所有行,然后根据列值(ID==value)进行筛选。你可以使用它来高效地完成这项工作。然后,对于查询中的每一行,使用期望值(ID==value)执行一个条件put,以确保正确
QueryRequest request = new QueryRequest();
// set up query request (table name, etc)
// set up query filter (ID == value)
QueryResponse response = client.query(request)
for (item in response.items):
PutItemRequest req = new PutItemRequest();
// set up put item request
// set up primary key for item to update
// hashkey = item.hashkey
// rangekey = item.rangeKey
// set up expected value (ID == value)
client.updateItem(req)
另一方面,由于您希望在特定时间之后高效地查询所有行,因此可以创建一个以“time”作为范围键的表,而不是将“time”作为基表的范围键。您仍然可以使用LSI进行高效查询(与按时间扫描表和筛选相比)。更重要的是,如果“ID”属性可以用hashkey唯一地标识一行,那么可以将“ID”作为基表的范围键。这样,您还可以高效地更新该项,因为您已经知道hashkey值和range key值(id值)
当然,只有当您的hashkey和“ID”能够唯一标识一行时,它才真正对您有利:)谢谢-我按照您的建议创建了一个本地二级索引。很好!
QueryRequest request = new QueryRequest();
// set up query request (table name, etc)
// set up query filter (ID == value)
QueryResponse response = client.query(request)
for (item in response.items):
PutItemRequest req = new PutItemRequest();
// set up put item request
// set up primary key for item to update
// hashkey = item.hashkey
// rangekey = item.rangeKey
// set up expected value (ID == value)
client.updateItem(req)