2015-04-02 95 views
1

我需要通過位於一列中的子字段JSON掃描表。不幸的是,我無法在Java中找到任何地方的例子,也不知道它是否可能。DynamoDB高級掃描 - JAVA

這是我的數據,這個json表示對象 - dynamodb中的一行。 JSON的代表3 Java類: - 包含級城市和一些串記錄 主類 - 城市包含一類道路

是否可以掃描數據庫,並找到mainName =「XYZ」的記錄,已經被稱爲 「羅金厄姆」

{ 
"Id": "9", 
"mainName": "xyz", 
"floatVariable": 228.3, 
"city": [ 
{ 
    "name": "Rockingham", 
    "road": [ 
    { 
     "roadName": "Traci", 
     "roadLength": 118 
    }, 
    { 
     "roadName": "Watkins", 
     "roadLength": 30 
    } 
    ] 
} 
], 

「房子」 一個城市的記錄:{ 「huseName」: 「溫迪·卡森」 }}

我有一些像這樣,這工作,但這個爲n不足以查詢正確的數據。 Table table = dynamoDB.getTable(tableName);

 Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); 
     expressionAttributeValues.put(":pr", 300); 

     ItemCollection<ScanOutcome> items = table.scan(
       "floatVariable < :pr", //FilterExpression 
       "Id, mainName, floatVariable, city" , //ProjectionExpression 
       null, //ExpressionAttributeNames - not used in this example 
       expressionAttributeValues); 

     System.out.println("Scan of " + tableName + " for items with a price less than 300."); 
     Iterator<Item> iterator = items.iterator(); 
     while (iterator.hasNext()) { 
      System.out.println(iterator.next().toJSONPretty()); 
     } 

我在php中看到了一個這樣的例子,但不幸的是它在Java中不起作用。

ItemCollection<ScanOutcome> items = table.scan(
      " cites.name = :dupa ", //FilterExpression 
      "Id, mainName, floatVariable, city", //ProjectionExpression 
      null, //ExpressionAttributeNames - not used in this example 
      expressionAttributeValues); 
+0

「cites.name =:DUPA」,// FilterExpression我想寫「city.name」 – Wojciech 2015-04-02 10:44:38

回答

0

如果您要查詢city.name您的數據模型必須考慮到這一點。我會建議有每桌項目一個城:

{ 
"Id": "9", 
"mainName": "xyz", 
"cityName": "Rockingham", 
"floatVariable": 228.3, 
"road": [ 
    { 
     "roadName": "Traci", 
     "roadLength": 118 
    }, 
    { 
     "roadName": "Watkins", 
     "roadLength": 30 
    } 
    ] 
} 
]} 

散列鍵將是cityName屬性和範圍鍵的任何其他屬性會導致主鍵(哈希+範圍鍵)唯一的,例如: Id

QuerySpec querySpec = new QuerySpec() 
         .withHashKey("cityName", "Rockingham") 
         .withProjectionExpression("Id, mainName, floatVariable, road"); 

ItemCollection<QueryOutcome> items = table.query(querySpec); 

正如你可以定義兩個表第二個選項:

表A

主鍵類型:散列鍵+ RANGE鍵

散列關鍵字:cityName 範圍重點: Id(參考表B項)

{ 
    "cityName": "Rockingham", 
    "Id" : 9, 
    "road": [ 
     { 
      "roadName": "Traci", 
      "roadLength": 118 
     }, 
     { 
      "roadName": "Watkins", 
      "roadLength": 30 
     } 
     ] 
    } 
    ]} 

表B

主鍵類型:散列鍵

散列關鍵字:Id

{ 
    "Id": "9", 
    "mainName": "xyz", 
    "floatVariable": 228.3 
} 

檢索城市的項目,你會被標識通過Query查詢表B之後,GetItemBatchGetItem

兩個選項將允許您使用Query操作,而不是Scan,有效地簡化了查詢具有更好的性能和更低的成本:

掃描操作始終掃描整個表或輔助索引, 然後過濾掉值來提供期望的結果,實質上 增加了從結果集中移除數據的額外步驟。如果可能,避免 在大型表或索引上使用掃描操作,並使用篩選器 刪除許多結果。另外,隨着表格或索引的增長,掃描操作會減慢。掃描操作檢查每個項目的 所請求的值,並且可以在單個操作中耗盡大規模表或索引的預配置吞吐量。爲了縮短響應時間, 會設計您的表格和索引,以便您的應用程序可以使用查詢 而不是掃描。 (對於表格,您也可以考慮使用GetItem 和BatchGetItem API。)。

來源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

0

城市屬性是一個不同長度的列表?如果你想使用服務器端過濾,你需要枚舉你想檢查的列表中的每個元素。

或者,您可以維護一個單獨的城市名稱列表,並在該屬性上使用「contains」運算符。

+0

確定現在我知道,我不能在二級屬性和唯一掃描查詢方法很快,值得在我的應用程序中使用。 (僅掃描報告) – Wojciech 2015-06-22 20:41:21