2016-09-15 17 views
1

私はこの権利を得ることはできません。 テーブルのスキャンを行い、特定のフィールドが存在しないレコードのみを返したいとします。彼らは、レコード(とほとんどのレコードは、このフィールドが欠落していません)を返すしかしdynamodbスキャン:属性が存在しないすべてのレコードをフィルタリングします。

HashMap<String, Condition> scanFilter = new HashMap(); 
Condition scanFilterCondition = new Condition().withComparisonOperator(ComparisonOperator.NULL.toString()); 
scanFilter.put("field", scanFilterCondition); 

ScanRequest scan = new ScanRequest() 
    .withTableName("table name") 
    .withScanFilter(scanFilter) 
etc 

ScanRequest scan = new ScanRequest() 
      .withTableName("table") 
      .withFilterExpression("attribute_not_exists(attributeName)") 
      .withLimit(100) 
      etc 

私は、次の二つのことを試してみました。フィルタを削除すると、スキャンが返され、すべてのレコードが期待どおりに処理され、基本クエリが正しいことに注意してください。 どうすればいいですか?

EDITは、それが
// Get information on the table so that we can set the read capacity for the operation. 
List<String> tables = client.listTables().getTableNames(); 
String tableName = tables.stream().filter(table -> table.equals(configuration.getTableName())).findFirst().get(); 
if(Strings.isNullOrEmpty(tableName)) 
    return 0; 
TableDescription table = client.describeTable(tableName).getTable(); 

//Set the rate limit to a third of the provisioned read capacity. 
int rateLimit = (int) (table.getProvisionedThroughput().getReadCapacityUnits()/3); 
RateLimiter rateLimiter = RateLimiter.create(rateLimit); 
// Track how much throughput we consume on each page 
int permitsToConsume = 1; 
// Initialize the pagination token 
Map<String, AttributeValue> exclusiveStartKey = null; 
int count = 1; 
int writtenCount = 0; 

do { 
    // Let the rate limiter wait until our desired throughput "recharges" 
    rateLimiter.acquire(permitsToConsume); 

    //We only want to process records that don't have the field key set. 
    HashMap<String, Condition> scanFilter = new HashMap<>(); 
    Condition scanFilterCondition = new Condition().withComparisonOperator(ComparisonOperator.NULL.toString()); 
    scanFilter.put("field", scanFilterCondition); 

    ScanRequest scan = new ScanRequest() 
     .withTableName(configuration.getNotificationsTableName()) 
     .withScanFilter(scanFilter) 
     .withLimit(100) 
     .withReturnConsumedCapacity(ReturnConsumedCapacity.TOTAL) 
     .withExclusiveStartKey(exclusiveStartKey); 

    ScanResult result = client.scan(scan); 
    exclusiveStartKey = result.getLastEvaluatedKey(); 

    // Account for the rest of the throughput we consumed, 
    // now that we know how much that scan request cost 
    double consumedCapacity = result.getConsumedCapacity().getCapacityUnits(); 
    permitsToConsume = (int)(consumedCapacity - 1.0); 
    if(permitsToConsume <= 0) { 
    permitsToConsume = 1; 
    } 

    // Process results here 
} while (exclusiveStartKey != null); 

答えて

1

条件は大丈夫のようですNULLに役立ちます場合には、完全なメソッドを追加しました。スキャンを使用して再帰的検索を行う必要があります。 Dynamodbスキャンは、データベース全体を一度にスキャンしません。消費されたプロビジョニングされたスループットの量に基づいてデータをスキャンします。

LastEvaluatedKeyに基づいてループ内でスキャンを実行するためのサンプルコードは、: -

ScanResult result = null; 

      do { 
       HashMap<String, Condition> scanFilter = new HashMap<>(); 
       Condition scanFilterCondition = new Condition().withComparisonOperator(ComparisonOperator.NULL); 
       scanFilter.put("title", scanFilterCondition); 

       ScanRequest scanRequest = new ScanRequest().withTableName(tableName).withScanFilter(scanFilter); 
       if (result != null) { 
        scanRequest.setExclusiveStartKey(result.getLastEvaluatedKey()); 
       } 

       result = dynamoDBClient.scan(scanRequest); 

       LOGGER.info("Number of records ==============>" + result.getItems().size()); 

       for (Map<String, AttributeValue> item : result.getItems()) { 
        LOGGER.info("Movies ==================>" + item.get("title")); 
       } 
      } while (result.getLastEvaluatedKey() != null); 

NULL:属性が存在しません。 NULLはリストとマップを含むすべてのデータ タイプでサポートされています。メモこの演算子は、データ型ではなく、属性が存在しないことを確認します( )。 属性 "a"のデータ型がNULLで、NULLを使用して評価すると、結果は ブール値falseです。これは、属性 "a"が存在するためです。そのデータ型 はNULL比較演算子には関係ありません。

LastEvaluatedKey操作 が停止した項目の主キー(前の結果セットを含む)。この値を使用して、新しい操作で を開始します。新しい要求でこの値を除外します。

LastEvaluatedKeyが空の場合、結果の「最終ページ」は に処理され、取得するデータはもうありません。

LastEvaluatedKeyが空でない場合は、必ずしも結果セットにさらに多くのデータがあることを意味するとは限りません。 が結果セットの最後に達したことを知る唯一の方法は、LastEvaluatedKeyが の場合です。

+0

私はコードの多くを追加しましたが、私の持っているものとほとんど同じです。少ないものでも、レコードも返しません。 – mark

+0

私はオプション1を今日に戻しました。今は期待どおりの結果を返しています。 私は昨日何が起こっていたのか分かりませんが、他の人に役立つように質問をここに残しておきます... – mark

+0

申し訳ありませんが、私はここでオプション1をどういう意味ですか? – notionquest

関連する問題