在不使用主键的情况下查找项目

时间:2015-09-07 13:16:18

标签: scala annotations amazon-dynamodb

我尝试使用用户名在dynamodb表中查找用户(用户名+密码),userid(int)是主键,因此getitem可以工作:

val user = Try(table.getItem("userid",2233))//this works

使用用户名查找用户(验证密码)不起作用,但我已经尝试过这个

我有一个配套对象:

object Authentication {
  @DynamoDBTable(tableName = "users")
  case class User(username: String, passwordMd5: String)
  ...
}

尝试使用以下方法扫描():

val scanExpression = new DynamoDBScanExpression()
scanExpression.addFilterCondition("username",
  new Condition()
    .withComparisonOperator(ComparisonOperator.EQ)
    .withAttributeValueList(new AttributeValue().withS("some_username")))`

但是这给了我以下错误:

com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Class class Authentication$User$ must be annotated with interface com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable

我需要解决这个问题?

解决方案(重写):

val client = new AmazonDynamoDBClient(new  ProfileCredentialsProvider())
client.setRegion(Region.getRegion(Regions.XXX))
val dynamoDB = new DynamoDB(client)
val table = dynamoDB.getTable("users")
val index = table.getIndex("username-index")

val spec = new QuerySpec()
  .withKeyConditionExpression("username = :v_username")
  .withValueMap(new ValueMap()
  .withString(":v_username", username))

val items = index.query(spec)

val iterator = items.iterator()
val user = Try(iterator.next())

问题是使用 index.query(spec) NOT table.query(spec)

1 个答案:

答案 0 :(得分:1)

我需要更多关于如何设置表格以回答问题的信息。

  1. 您是否有其他非主要指数?
  2. 您使用主键吗?还是小学+范围?
  3. 为了根据不是主键的密钥查找用户:

    1. 您可以添加辅助索引
    2. 执行扫描操作并手动过滤掉匹配结果
    3. 添加范围键(即用户名)