2016-12-11 41 views
0

我試圖根據使用掃描請求的搜索條件從Dynamo DB檢索數據。我正在按照http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LowLevelDotNetScanning.html頁面中提到的步驟操作,我的DynamoDB表包含超過100萬條記錄,我知道通過使用do-while循環和ExclusiveStartKey,我們可以從發電機DB獲取記錄,但在我的情況下,我不能等待直到搜索過程完成,因爲這會掛我angularJS UI,而不是我想逐步加載與進行等待搜索過程來完成數據的,我們如何能做到這一點使用AWSSDK.net(核心版本3.3.5和AWSSDK.DynamoDBv2版本3.3.1)從DynamoDB檢索數據

樣品要求:。。?

var lastEvaluatedKey = new Dictionary<string, AttributeValue>(); ; 
    AmazonDynamoDBClient amazonDynamoDbClient= new AmazonDynamoDBClient() 
     var filterExpression = "#aws_s3_bucket = :v_aws_s3_bucket and contains(#aws_s3_key,:v_aws_s3_key)"; 
     var projectExpression = "#aws_s3_key,filename,#region,aws_s3_bucket,#projecttype,folder,#siteid,locationname,createdon,modifiedon"; 



     do 
     { 
     var request = new ScanRequest 
      { 
       TableName = "Test1", 
       ExclusiveStartKey=lastEvaluatedKey, 

       FilterExpression = filterExpression, 
       ExpressionAttributeNames = new Dictionary<string, string> 
          { 
           { "#region", "region" }, 
           { "#siteid", "siteid" }, 
           { "#projecttype", "projecttype" }, 
           { "#aws_s3_key", "aws_s3_key" }, 
           { "#aws_s3_bucket", "aws_s3_bucket" }      
          }, 
       ExpressionAttributeValues = new Dictionary<string, AttributeValue> { 
          {":v_aws_s3_bucket", new AttributeValue { S = "sampleBucket"}}, 
          {":v_aws_s3_key", new AttributeValue { S = "92226"}} 
          }, 

       ConsistentRead = true, 
       ProjectionExpression = projectExpression 
      }; 

     response = amazonDynamoDbClient.Scan(request); 
    lastEvaluatedKey = response.LastEvaluatedKey;}while(lastEvaluatedKey!=null && lastEvaluatedKey.count()!=0) 

我試着用do-while循環執行上面的請求,並保存了ExclusiveStartKey,以便發出下一個請求錯誤:「提供的起始鍵無效:一個或多個pa rameter值無效:空屬性值類型的值必須爲true「。

在這個問題上的任何幫助,將有助於...

+0

你在哪裏存儲lastEvaluatedKey?您需要從存儲對象中獲取鍵值並明確設置開始鍵值。 – notionquest

+0

抱歉,我錯過了此行我的文章請在下面找到詳細信息。 來自ScanReponse對象,我正在檢索上次掃描的按鍵。 lastEvaluatedKey = response.LastEvaluatedKey; – user3656240

+0

更新了包含lastEvaluatedKey設置的邏輯。 – user3656240

回答

0

你得到的錯誤似乎是因爲你的請求,而不用於它的參數設置任何值設置ExclusiveStartKey。注意你在得到你的迴應後沒有更新request.ExclusiveStartKey。很顯然,如果你不這樣做,當你達到你的限制時,掃描將不知道再次提取的位置。見下文。

AmazonDynamoDBClient amazonDynamoDbClient= new AmazonDynamoDBClient() 
var filterExpression = "#aws_s3_bucket = :v_aws_s3_bucket and contains(#aws_s3_key,:v_aws_s3_key)"; 
var projectExpression = "#aws_s3_key,filename,#region,aws_s3_bucket,#projecttype,folder,#siteid,locationname,createdon,modifiedon"; 
ScanRequest request = new ScanRequest 
     { 
      TableName = "Test1", 
      FilterExpression = filterExpression, 
      ExpressionAttributeNames = new Dictionary<string, string> 
         { 
          { "#region", "region" }, 
          { "#siteid", "siteid" }, 
          { "#projecttype", "projecttype" }, 
          { "#aws_s3_key", "aws_s3_key" }, 
          { "#aws_s3_bucket", "aws_s3_bucket" }      
         }, 
      ExpressionAttributeValues = new Dictionary<string, AttributeValue> { 
         {":v_aws_s3_bucket", new AttributeValue { S = "sampleBucket"}}, 
         {":v_aws_s3_key", new AttributeValue { S = "92226"}} 
         }, 

      ConsistentRead = true, 
      ProjectionExpression = projectExpression 
     }; 

    do 
    { 
     response = amazonDynamoDbClient.Scan(request); 
     request.ExclusiveStartKey = response.LastEvaluatedKey; 
    } while (response.lastEvaluatedKey.Count != 0);