我有500個項目要使用500個主鍵屬性進行檢索,我想檢索每個項目的4個屬性而不是所有屬性。我在Java中使用DynamoDBMapper,但我無法找到將它們投影到特定數量屬性的方法。檢索所有屬性可能會非常昂貴,因爲其中一個屬性可能非常大。有沒有辦法使用DynamoDBMapper獲取所有這500個項目的4個屬性?使用DynamoDBMapper的投影表達式
回答
是的,DynamoDBMapper
支持將ProjectionExpressions與query
和scan
方法一起使用。我在load
上看不到任何支持。
以下是使用public <T> PaginatedQueryList<T> query(java.lang.Class<T> clazz, DynamoDBQueryExpression<T> queryExpression)
並提供投影DynamoDBQueryExpression
的示例。查看.withProjectionExpression("var1, #projectedVar")
,其中一個屬性使用ExpressionAttributeNames。如果您需要檢索不屬於頂級屬性的屬性,你將不得不看DocumentPaths documentation:
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
import com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.util.Tables;
import java.util.HashMap;
import java.util.Map;
public class MyTest {
public static final String TABLE_NAME = "test_table";
public static void main(String[] args) throws Exception {
final AmazonDynamoDB dynamodb =
new AmazonDynamoDBClient(new BasicAWSCredentials("aws", "key"));
dynamodb.setEndpoint("http://localhost:8000");
if (Tables.doesTableExist(dynamodb, TABLE_NAME)) {
dynamodb.deleteTable(TABLE_NAME);
}
final DynamoDBMapper mapper = new DynamoDBMapper(dynamodb);
final CreateTableRequest request = mapper.generateCreateTableRequest(MyClass.class)
.withProvisionedThroughput(new ProvisionedThroughput(5L, 5L));
dynamodb.createTable(request);
final MyClass myClass1 = new MyClass();
myClass1.setHash("H1");
myClass1.setRange("R1");
myClass1.setVar1("v1");
myClass1.setVar2("v2");
myClass1.setVar3("v3");
mapper.save(myClass1);
myClass1.setRange("R2");
myClass1.setVar1("v4");
myClass1.setVar2("v5");
myClass1.setVar3("v6");
mapper.save(myClass1);
myClass1.setRange("R3");
myClass1.setVar1("v7");
myClass1.setVar2("v8");
myClass1.setVar3("v9");
mapper.save(myClass1);
final HashMap<String, String> expressionAttributeNames = new HashMap<>();
expressionAttributeNames.put("#myHash", "hash");
expressionAttributeNames.put("#projectedVar", "var3");
final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>();
expressionAttributeValues.put(":hashValue", new AttributeValue("H1"));
final DynamoDBQueryExpression<MyClass> queryExpression = new DynamoDBQueryExpression<MyClass>()
.withKeyConditionExpression("#myHash = :hashValue")
.withExpressionAttributeNames(expressionAttributeNames)
.withExpressionAttributeValues(expressionAttributeValues)
.withProjectionExpression("var1, #projectedVar");
final DynamoDBMapperConfig mapperConfig =
new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT);
final PaginatedQueryList<MyClass> query = mapper.query(MyClass.class, queryExpression, mapperConfig);
query.forEach(System.out::println);
}
}
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
@DynamoDBTable(tableName = MyTest.TABLE_NAME)
public class MyClass {
private String hash;
private String range;
private String var1;
private String var2;
private String var3;
@DynamoDBHashKey
public String getHash() { return hash; }
public void setHash(String hash) { this.hash = hash; }
@DynamoDBRangeKey
public String getRange() { return range; }
public void setRange(String range) { this.range = range; }
@DynamoDBAttribute
public String getVar1() { return var1; }
public void setVar1(String var1) { this.var1 = var1; }
@DynamoDBAttribute
public String getVar2() { return var2; }
public void setVar2(String var2) { this.var2 = var2; }
@DynamoDBAttribute
public String getVar3() { return var3; }
public void setVar3(String var3) { this.var3 = var3; }
@Override
public String toString() {
return "MyClass{" +
"hash='" + hash + '\'' +
", range='" + range + '\'' +
", var1='" + var1 + '\'' +
", var2='" + var2 + '\'' +
", var3='" + var3 + '\'' +
'}';
}
}
和輸出,表明只有投射檢索屬性:
MyClass{hash='null', range='null', var1='v1', var2='null', var3='v3'}
MyClass{hash='null', range='null', var1='v4', var2='null', var3='v6'}
MyClass{hash='null', range='null', var1='v7', var2='null', var3='v9'}
根據http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaORMDynamoDBMapper.html 「只有當其主鍵由散列和範圍屬性組成時,才能查詢表」。 我的表的主鍵是由哈希組成。所以,我猜「查詢」不適合我。我錯過了什麼? –
@NeerajGupta你知道你想要檢索的項目的哈希鍵嗎? – mkobit
- 1. 如何使用純sql表達投影?
- 2. 動態選擇投影表達式
- 3. 正則表達式作爲投影
- 4. nhibernate複雜投影表達式
- 5. 如何使用正則表達式$投影
- 6. 使用executeQuery()對算術表達式進行Grails投影?
- 7. 使用MATLAB投影矩陣反投影
- 8. 如何在投影中用正則表達式查詢mongodb?
- 9. 以投影方式投影FrameLayout
- 10. 春季引導最簡單的方式來表達投影
- 11. AutoMapper投影中的Lambda表達式錯誤
- 12. 投影使用pyproj
- 13. 將未投影的雷達圖像投影到osmdroid
- 14. dynamodb batchupdate使用DynamoDBMapper
- 15. NHibernate的投影使用SqlQuery
- 16. 投影使用MongoDB的
- 17. 使用LINQ投射投影列表返回空值列表?
- 18. 影響表達後使用「表達式層」
- 19. NHibernate的投影:如何獲得使用標準API與投影
- 20. 如何創建可重用的實體框架投影表達式?
- 21. 投影表上翻轉的陰影?
- 22. MKMapView使用什麼投影?
- 23. SortedDictionary投影使用linq
- 24. ReactiveMongo:如何使用投影
- 25. YQL列投影使用XPATH
- 26. 何時使用Hibernate投影?
- 27. SpringData MongoDB使用投影
- 28. NHibernate的:投影列表
- 29. 在不同的LINQ表達式再利用有兩個來源保存的投影表達對象
- 30. 帶RestController的彈簧投影投影
你是什麼意思*「無法找到一種方法將它們投影到特定數量的屬性」*?你能舉一個你遇到問題的例子嗎? – mkobit
舉一個簡單的例子 - 假設我有一張 (Studentid,student_name,lifetime_course_name_list)的表格 我只想檢索500名學生的名字,並給出他們的ID。假設lifetime_course_name_list是學生在他整個一生中所學的課程列表,所以這非常巨大。 –