2016-10-06 3 views
0

Возможно ли в настоящее время получить подмножество объекта json, хранящегося в Dynamo? Например, у меня есть атрибут с именем записи типа JSON, который представляет собой массив объектов JSON:Получение подмножества объекта JSON, хранящегося в Dynamo

records: 
[ 
    {"K1": "V1" }, 
    {"K2": "V2" }, 
    {"K3": "V3" }, 
    {"K4": "V4" } 
] 

Я хранить их в формате JSON в Динамо. Я хотел знать, могу ли я получить только пары значений 1 - 2, а не 3 и 4? Я не уверен, могу ли я предоставить конкретное выражение фильтра для выполнения этой операции.

Если возможно, мне бы хотелось услышать методологию о том, как это можно сделать?

Спасибо!

+0

Каков тип данных DynamoDB атрибутов «записи»? Это карта? – notionquest

+0

Я думал о двух типах: один как строка json после сериализации его с чем-то вроде gson. Второй вариант - сериализовать его, но сохранить его как список, а не одну строку. – chrisrhyno2003

ответ

0

Во-первых, нет данных типа JSON в DynamoDB. Если вы имеете в виду, что данные хранятся в виде данных типа DynamoDB MAP, то нижеприведенное решение должно работать на вас.

Короче говоря, выражение фильтра должно быть что-то, как показано ниже: -

FilterExpression : 'records.K1 = :recordsK1Value and records.K2 = :recordsK2Value' 

Если вам нужно иметь только «records.K1» и «records.K2» на выходе, вы можете использовать выражение для проекта что.

ProjectionExpression : 'records.K1, records.K2' 

Полный код: -

public List<String> queryMoviesAndFilterByMapAttribute() { 

    List<String> moviesJsonList = new ArrayList<>(); 

    DynamoDB dynamoDB = new DynamoDB(dynamoDBClient); 

    Table table = dynamoDB.getTable("Movies"); 

    QuerySpec querySpec = new QuerySpec(); 

    querySpec.withKeyConditionExpression("yearkey = :yearval and title = :titleval") 
      //.withProjectionExpression("records.K1, records.K2") 
      .withFilterExpression("records.K1 = :recordsK1Value and records.K2 = :recordsK2Value").withValueMap(
        new ValueMap().withNumber(":yearval", 1991).withString(":titleval", "Movie with map attribute") 
          .withString(":recordsK1Value", "V1").withString(":recordsK2Value", "V2")); 

    IteratorSupport<Item, QueryOutcome> iterator = table.query(querySpec).iterator(); 

    while (iterator.hasNext()) { 
     Item movieItem = iterator.next(); 
     System.out.println("Movie data ====================>" + movieItem.toJSONPretty()); 
     moviesJsonList.add(movieItem.toJSON()); 
    } 

    return moviesJsonList; 

} 

Пример вывода всех полей (т.е. без выражения проекта): -

Movie data ====================>{ 
    "yearkey" : 1991, 
    "records" : { 
    "K1" : "V1", 
    "K2" : "V2", 
    "K3" : "V3", 
    "K4" : "V4" 
    }, 
    "title" : "Movie with map attribute" 
} 

Пример вывода после того, как не-Комментирование выражение проекта: -

Обратите внимание, что другие поля, такие как yearkey, title, K3 и K4, отсутствуют на выходе.

Movie data ====================>{ 
    "records" : { 
    "K1" : "V1", 
    "K2" : "V2" 
    } 
} 
+0

Большое вам спасибо за этот ответ. Это действительно помогает. У меня был один вопрос. Эта реализация предназначена для Карты. Можно ли получить подмножество списка аналогичного способа? Я предполагаю, что концепция наличия ключей в выражении projectionExpression будет отличаться? Я хочу знать только, если это возможно, не хотел бы, чтобы вы не решались решить его полностью. Спасибо! – chrisrhyno2003

+0

Да, это возможно, если это список значений String. Пример: - FilterExpression: 'содержит (records,: recordsK1Value)', ProjectionExpression: 'records [0], records [1]', – notionquest

+0

Отлично! Большое вам спасибо за помощь! – chrisrhyno2003

Смежные вопросы