2017-05-26 45 views
0

非主キーフィールドに基づいてバルクDynamodbアップデートを行う最良の方法は何ですか?たとえば、deploymentKey = "UK"のテーブルがある場合、フィールド設定を "uk-config"に更新します。私はamazonのドキュメント、特に "update-item"を見てきましたが、それはプライマリキーに基づいてのみ更新されます。dynamodbフィールドに基づく一括更新

追加私はテーブル内のすべてのアイテムを返すJavaの例を見ましたが、私のケースではアイテムを返さないままです。パーティション・キーと

// Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. 
// Licensed under the Apache License, Version 2.0. 
package com.amazonaws.codesamples.document; 

import java.io.IOException; 
import java.util.List; 
import java.util.Map; 

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; 
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; 
import com.amazonaws.services.dynamodbv2.document.BatchGetItemOutcome; 
import com.amazonaws.services.dynamodbv2.document.DynamoDB; 
import com.amazonaws.services.dynamodbv2.document.Item; 
import com.amazonaws.services.dynamodbv2.document.TableKeysAndAttributes; 
import com.amazonaws.services.dynamodbv2.model.KeysAndAttributes; 

public class DocumentAPIBatchGet { 
    static AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); 
static DynamoDB dynamoDB = new DynamoDB(client); 

static String forumTableName = "Forum"; 
static String threadTableName = "Thread"; 

public static void main(String[] args) throws IOException { 
    retrieveMultipleItemsBatchGet(); 
} 

private static void retrieveMultipleItemsBatchGet() { 

    try { 

     TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes(forumTableName); 
     // Add a partition key 
     forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name", "Amazon S3", "Amazon DynamoDB"); 

     TableKeysAndAttributes threadTableKeysAndAttributes = new TableKeysAndAttributes(threadTableName); 
     // Add a partition key and a sort key 
     threadTableKeysAndAttributes.addHashAndRangePrimaryKeys("ForumName", "Subject", "Amazon DynamoDB", 
      "DynamoDB Thread 1", "Amazon DynamoDB", "DynamoDB Thread 2", "Amazon S3", "S3 Thread 1"); 

     System.out.println("Making the request."); 

     BatchGetItemOutcome outcome = dynamoDB.batchGetItem(forumTableKeysAndAttributes, 
      threadTableKeysAndAttributes); 

     Map<String, KeysAndAttributes> unprocessed = null; 

     do { 
      for (String tableName : outcome.getTableItems().keySet()) { 
       System.out.println("Items in table " + tableName); 
       List<Item> items = outcome.getTableItems().get(tableName); 
       for (Item item : items) { 
        System.out.println(item.toJSONPretty()); 
       } 
      } 
      // Check for unprocessed keys which could happen if you exceed 
      // provisioned 
      // throughput or reach the limit on response size. 
      unprocessed = outcome.getUnprocessedKeys(); 

      if (unprocessed.isEmpty()) { 
       System.out.println("No unprocessed keys found"); 
      } 
      else { 
       System.out.println("Retrieving the unprocessed keys"); 
       outcome = dynamoDB.batchGetItemUnprocessed(unprocessed); 
      } 

     } while (!unprocessed.isEmpty()); 

    } 
    catch (Exception e) { 
     System.err.println("Failed to retrieve items."); 
     System.err.println(e.getMessage()); 
    } 
    } 
} 

答えて

0

DynamoDBのUpdateItem のみ作品 - あなたはそれを知っていない場合、あなたはそれを使用することはできません。パーティションとソートキー(テーブルにテーブルがある場合)なしで更新(バルクまたはそれ以外)を行う方法はありません。

私はJavaで作業していませんが、基本的には適切な値を探してテーブルをスキャンし、各アイテムを1つずつ更新する必要があります。たくさんのデータを持っているなら、それは遅くなるでしょう。