Pemindaian Rentang AWS DynamoDB menggunakan DynamoDBMapper

Saya sudah mencoba upaya pertama saya menggunakan DynamoDB setelah sekian lama menggunakan database relasional, ini sekarang dilakukan untuk memperbarui hasil tes untuk analisis nanti, pertimbangkan tabel berikut dan indeks sekunder

12

Saya telah mencoba mendapatkan testName tertentu, pengujian berjalan dalam rentang revisi yang diketahui menggunakan kode Java berikut:

HashMap<String, Condition> scanMap = new HashMap<>();
scanMap.put("revision", new Condition().withComparisonOperator(ComparisonOperator.BETWEEN).withAttributeValueList(Arrays.asList(new AttributeValue("N:"+String.valueOf(minRev)), new AttributeValue("N:"+String.valueOf(maxRev)))));
scanMap.put("testName", new Condition().withComparisonOperator(ComparisonOperator.EQ).withAttributeValueList(new AttributeValue(Collections.singletonList(testName))));
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression().withScanFilter(scanMap);
scanExpression.setIndexName("testName-revision-index");
List<ValidationReport> reports = getMapper().scan(ValidationReport.class, scanExpression);

Saya sudah mencoba menghapus "N:" tetapi tidak berhasil. Menghapus ekspresi revisi secara keseluruhan akan mengembalikan semua pengujian yang berjalan tanpa batasan pada rentang revisi

Bantuan apa pun akan dihargai di sini


person Ohad Benita    schedule 24.05.2017    source sumber


Jawaban (1)


Jadi, sepertinya saya menggonggong pada pohon yang salah di sini, mencoba menggunakan Scan alih-alih Query :

Pelanggan tidak boleh menggunakan ScanFilter, yang sudah tidak digunakan lagi. Tipe data Daftar/Peta lebih cocok dengan sintaks FilterExpression yang baru. Saya menduga masalahnya ada pada atribut multi-nilai dengan "N:" di namanya; ini sepertinya tidak mendekati format kabel. Untuk menggunakan ekspresi filter "baru", mereka harus membuat ExpressionAttributeNames dan ExpressionAttributeValues ​​untuk memberi tahu AWS SDK tentang atribut untuk filter, addExpressionAttributeNamesEntry dan addExpressionAttributeValuesEntry.http://docs.aws.amazon.com/AWSJavaSDK/terbaru/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBScanExpression.html Selain itu, saya akan lalai jika tidak menunjukkan bahwa Pemindaian sama sekali bukan tindakan API yang tepat untuk kueri ini; Kueri adalah tindakan yang benar. testName harus digunakan dengan Query dengan KeyConditionExpression untuk mempersempit pencarian ke partisi yang benar, dan revisi harus ditambahkan ke dalamnya dengan sintaks BETWEEN. Pemindaian ditujukan untuk pencadangan dan operasi latar belakang, dan dalam hal ini skema indeks pelanggan dapat digunakan dengan Query untuk mempersempit pencarian. Peringatkan mereka tentang penggunaan Pindai; ini adalah praktik terbaik yang mendasar:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html

Jadi saya menggunakan Query sebagai gantinya:

    Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
    eav.put(":v1", new AttributeValue().withS(testName));
    eav.put(":v2", new AttributeValue().withS(version));
    eav.put(":v3", new AttributeValue().withN(String.valueOf(minRev)));
    eav.put(":v4", new AttributeValue().withN(String.valueOf(maxRev)));

    final DynamoDBQueryExpression<ValidationReport> query = new DynamoDBQueryExpression<>();
    query.withKeyConditionExpression("testName = :v1");
    query.withFilterExpression("buildVersion = :v2 and revision BETWEEN :v3 AND :v4");
    query.setConsistentRead(false);
    query.withExpressionAttributeValues(eav);
    return getMapper().query(ValidationReport.class, query);`

Harap dicatat bahwa ketika menggunakan AttributeValue ada perbedaan yang cukup besar antara berikut ini :

new AttributeValue().withS("SomeStringValue")
new AttributeValue().withN("SomeNumber")

Itulah yang saya lewatkan

person Ohad Benita    schedule 25.05.2017