密钥的DynamoDBTypeConvertedJson属性顺序

时间:2018-07-12 05:40:29

标签: json amazon-dynamodb

我正在使用一个DDB,该DDB通过使用DynamoDBTypeConvertedJson使用DynamoDBMapper将项目转换为分区键。

例如:

public class TestObject{
   private int id;
   private String name;
}

@DynamoDBTable(tableName = TestTable.TABLE_NAME)
public class DynamoDBTestItem{
   private testObj;

@DynamoDBIndexHashKey(globalSecondaryIndexName = TestTable.TEST_INDEX)
@DynamoDBTypeConvertedJson
public TestObject getTestObject() {
    return testObject;
}

public void setTestObject(TestObject testObj) {
    this.testObj = testObj;
}
}

似乎DynamoDBTypeConvertedJson基于Jackson JSON,默认情况下不保留属性顺序。因此,我们可以将项目另存为

{\"id\":7,\"name\":\"ObjName\"} or {\"name\":ObjName,\"id\":\"7\"}

查询数据库时,我确实发现有些记录的ID首先是ID,有些记录的名字是

现在,当我执行以下操作时:

DynamoDBTestItem hashKey = new DynamoDBTestItem;
hashKey = new TestObj(7, "ObjName");
            DynamoDBQueryExpression<DynamoDBTestItem> expression = new DynamoDBQueryExpression<DynamoDBTestItem>()
                .withIndexName(TestTable.TEST_INDEX)
                .withHashKeyValues(hashKey)
                .withConsistentRead(false);

我很好奇的是,由于未保留JSON属性顺序,此查询是否会导致命中缺失。因此,如果在保存的条目中,“ id”位于“ name”之前,但是当我们进行查询时,JSON决定将“ name”置于“ id”之前,这会导致查询命中丢失吗?

从理论上来说,这似乎会发生,但是我还没有看到它在此系统中发生,这就是为什么我很好奇的原因。系统在这里很幸运吗?

谢谢

1 个答案:

答案 0 :(得分:1)

@DynamoDBTypeConvertedJson注释(source code)使用fastxml jackson ObjectMapper,其默认设置为sort properties alphabetically(链接文档中提到了一些警告)。

在您描述的情况下,顺序将始终相同,但是有可能创建顺序不一致的情况。