DynamoDB中的嵌套查询不返回任何内容 [英] Nested Query in DynamoDB returns nothing

查看:87
本文介绍了DynamoDB中的嵌套查询不返回任何内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Java SDK中使用DynamoDB,但是在查询嵌套文档时遇到了一些问题.我在下面包括了简化的代码.如果删除过滤器表达式,则返回所有内容.使用过滤器表达式,不会返回任何内容.我也尝试过使用withQueryFilterEntry(我想使用它),并且得到相同的结果.任何帮助表示赞赏.在线上的大多数文档和论坛似乎都使用比我正在使用的Java sdk更旧的版本.

I'm using DynamoDB with the Java SDK, but I'm having some issues with querying nested documents. I've included simplified code below. If I remove the filter expression, then everything gets returned. With the filter expression, nothing is returned. I've also tried using withQueryFilterEntry(which I'd prefer to use) and I get the same results. Any help is appreciated. Most of the documentation and forums online seem to use an older version of the java sdk than I'm using.

这是杰森

{
  conf:
    {type:"some"},
  desc: "else"
}

这是查询

DynamoDBQueryExpression<JobDO> queryExpression = new DynamoDBQueryExpression<PJobDO>();
queryExpression.withFilterExpression("conf.Type = :type").addExpressionAttributeValuesEntry(":type", new AttributeValue(type));
return dbMapper.query(getItemType(), queryExpression);

推荐答案

这是命名问题吗? (您的示例json具有类型",但查询使用的是类型")

Is it a naming issue? (your sample json has "type" but the query is using "Type")

例如以下使用DynamoDB Local为我工作:

e.g. the following is working for me using DynamoDB Local:

public static void main(String [] args) {

    AmazonDynamoDBClient client = new AmazonDynamoDBClient(new BasicAWSCredentials("akey1", "skey1"));
    client.setEndpoint("http://localhost:8000");
    DynamoDBMapper mapper = new DynamoDBMapper(client);

    client.createTable(new CreateTableRequest()
        .withTableName("nested-data-test")
        .withAttributeDefinitions(new AttributeDefinition().withAttributeName("desc").withAttributeType("S"))
        .withKeySchema(new KeySchemaElement().withKeyType("HASH").withAttributeName("desc"))
        .withProvisionedThroughput(new ProvisionedThroughput().withReadCapacityUnits(1L).withWriteCapacityUnits(1L)));

    NestedData u = new NestedData();
    u.setDesc("else");
    Map<String, String> c = new HashMap<String, String>();
    c.put("type", "some");
    u.setConf(c);
    mapper.save(u);

    DynamoDBQueryExpression<NestedData> queryExpression = new DynamoDBQueryExpression<NestedData>();
    queryExpression.withHashKeyValues(u);
    queryExpression.withFilterExpression("conf.#t = :type")
        .addExpressionAttributeNamesEntry("#t", "type") // returns nothing if use "Type"
        .addExpressionAttributeValuesEntry(":type", new AttributeValue("some"));
    for(NestedData u2 : mapper.query(NestedData.class, queryExpression)) {
        System.out.println(u2.getDesc()); // "else"
    }
}

NestedData.java:

NestedData.java:

@DynamoDBTable(tableName = "nested-data-test")
public class NestedData {

    private String desc;
    private Map<String, String> conf;

    @DynamoDBHashKey
    public String getDesc() { return desc; }
    public void setDesc(String desc) { this.desc = desc; }

    @DynamoDBAttribute
    public Map<String, String> getConf() { return conf; }
    public void setConf(Map<String, String> conf) { this.conf = conf; }
}

这篇关于DynamoDB中的嵌套查询不返回任何内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆