DynamoDB高级扫描-JAVA

DynamoDB高级扫描-JAVA,java,json,amazon-dynamodb,Java,Json,Amazon Dynamodb,我需要通过位于一列中的子字段JSON扫描表。不幸的是,我在Java中找不到任何地方的例子,也不知道这是否可行 这是我的数据,这个json表示对象——dynamodb中的一行。 json代表3个java类: -主类,其中包含类city和一些字符串记录 -城市包含一条等级公路 是否可以扫描数据库并找到mainName=“xyz”且具有名为“Rockingham”的城市记录的记录 “房子”:{ “huseName”:“Wendy Carson” } } 我有一些类似的工作,但这还不足以查询正确的数据。

我需要通过位于一列中的子字段JSON扫描表。不幸的是,我在Java中找不到任何地方的例子,也不知道这是否可行

这是我的数据,这个json表示对象——dynamodb中的一行。 json代表3个java类: -主类,其中包含类city和一些字符串记录 -城市包含一条等级公路

是否可以扫描数据库并找到mainName=“xyz”且具有名为“Rockingham”的城市记录的记录

“房子”:{ “huseName”:“Wendy Carson” } }

我有一些类似的工作,但这还不足以查询正确的数据。 Table Table=dynamoDB.getTable(tableName)

Map expressionAttributeValues=newhashmap();
expressionAttributeValues.put(“:pr”,300);
ItemCollection items=table.scan(
“floatVariable<:pr”,//FilterExpression
“Id,mainName,floatVariable,city”,//ProjectionExpression
null,//ExpressionAttributeNames-本例中未使用
表达式属性值);
System.out.println(“价格低于300的项目的“+tableName+”扫描”);
迭代器迭代器=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);
ItemCollection items=table.scan(
“cites.name=:dupa”,//FilterExpression
“Id,mainName,floatVariable,city”,//ProjectionExpression
null,//ExpressionAttributeNames-本例中未使用
表达式属性值);

城市属性是一个长度不同的列表吗?如果要使用服务器端筛选,则需要枚举要检查的列表中的每个元素


或者,您可以维护一个单独的城市名称列表,并在该属性上使用“contains”操作符。

如果您是通过
城市进行查询。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);
表B

主键类型:哈希键

散列键:
Id

{
    "Id": "9",
    "mainName": "xyz",
    "floatVariable": 228.3
}
检索城市项目后,您将通过
query
GetItem
BatchGetItem
按Id查询表B

这两个选项都允许您使用
查询
操作,而不是
扫描
,从而实现更简单的查询,具有更好的性能和更低的成本:

扫描操作始终扫描整个表或辅助索引, 然后过滤掉值以提供所需的结果,基本上 添加从结果集中删除数据的额外步骤。避开 对大表或索引使用扫描操作,并使用 如果可能,删除许多结果。此外,随着表或索引的增长, 扫描操作会变慢。扫描操作会检查每个项目是否存在错误 请求的值,并且可以使用为 单个操作中的大型表或索引。为了更快的响应时间, 设计表和索引,以便应用程序可以使用查询 而不是扫描。(对于表,您也可以考虑使用GestITEM)。 和BatchGetItemAPI。)


来源:

“cites.name=:dupa”//filtereexpression我想写“city.name”好了,现在我知道我不能扫描第二级属性,唯一的查询方法是快速的,值得在我的应用程序中使用。(仅扫描报告)
QuerySpec querySpec = new QuerySpec()
                        .withHashKey("cityName", "Rockingham")
                        .withProjectionExpression("Id, mainName, floatVariable, road");

ItemCollection<QueryOutcome> items = table.query(querySpec);
{
    "cityName": "Rockingham",
    "Id" : 9,
    "road": [
        {
          "roadName": "Traci",
          "roadLength": 118
        },
        {
          "roadName": "Watkins",
          "roadLength": 30
        }
      ]
     }
    ]}
{
    "Id": "9",
    "mainName": "xyz",
    "floatVariable": 228.3
}