当前位置: 首页 > 知识库问答 >
问题:

使用GSI时,DynamoDBmapper不会返回我的所有数据

谭坚诚
2023-03-14

实际上,我正在使用DynamoDBmapper查询我的dynamo表。为此,我创建了两个类,映射程序使用它们转换表返回的查询。见下文

ame.java

@DynamoDBTable(tableName = "customer_table")
public class CustomerTable {

    @DynamoDBHashKey(attributeName = "customer_id")
    String customerId;

    @DynamoDBIndexHashKey(attributeName = "customer_id_bis", globalSecondaryIndexName = "customer_id_bis-index")
    String customerIdBis;

    @DynamoDBIndexHashKey(attributeName = "customer_id_tier", globalSecondaryIndexName = "customer_id_tier-index")
    String customerIdTier;

    @DynamoDBAttribute(attributeName = "salutations")
    List<Salutations> salutations;
}

java

@DynamoDBDocument
public class Salutations {

    @DynamoDBAttribute(attributeName = "salutations_id")
    private String salutationsId;

    @DynamoDBAttribute(attributeName = "rank")
    private Integer rank;

    @DynamoDBAttribute(attributeName = "score")
    private String score;

    @DynamoDBAttribute(attributeName = "typos")
    private List<String> typos;
}

然后我在HashKey上查询我的表,如下所示

Map<String, AttributeValue> keyToGet = Map.of(":column", new AttributeValue(value));
DynamoDBQueryExpression<CustomerTable> queryExpression = new DynamoDBQueryExpression<CustomerTable>()
                .withKeyConditionExpression("customer_id = :column")
                .withExpressionAttributeValues(keyToGet);
mapper.query(CustomerTable.class, queryExpression);

对于GSI,我会这样做

Map<String, AttributeValue> keyToGet = Map.of(":column", new AttributeValue(value));
DynamoDBQueryExpression<CustomerTable> queryExpression = new DynamoDBQueryExpression<CustomerTable>()
                .withIndexName("customer_id_bis-index")
                .withKeyConditionExpression("customer_id_bis = :column")
                .withConsistentRead(false)
                .withExpressionAttributeValues(keyToGet);
mapper.query(CustomerTable.class, queryExpression);

一切都很好,但是对于名为typos的字段,我得到了两个查询之间的差异。对于customer_id,我获得如下完整元素

{
    "customer_id":"jean",
    "customer_id_bis":"paul",
    "customer_id_tier":"sartre",
    "salutations": [{
        "salutations_id": "12345",
        "rank": 1,
        "score": "0.6796357154846191",
        "typos": [        
            "185",
            "198",
            "199"
        ]
    }]
}

但对于同一个用户,但使用他的GSI,我得到如下结果

{
    "customer_id":"jean",
    "customer_id_bis":"paul",
    "customer_id_tier":"sartre",
    "salutations": [{
        "salutations_id": "12345",
        "rank": 1,
        "score": "0.6796357154846191",
        "typos": []
    }]
}

我不明白为什么我对同一个用户得到不同的结果。

共有1个答案

乜昆
2023-03-14

似乎你的DynamoDB GSI是用KEYS_ONLY定义的。

您必须从表中投影您希望在GSI中具有的任何其他属性

或者,由于使用GSI的查询返回记录的PK,您可以在表上使用GetItem()。

 类似资料:
  • 我对Dynamo DB非常陌生,可能这是一个非常琐碎的问题,但我浏览了Dynamo DB和堆栈溢出问题的文档,但我找不到一个链接来告诉如何为GSI查询DDB,GSI只有哈希键,没有指定范围键。 我得到异常非法查询表达式:在查询中没有找到哈希键条件。

  • 当前使用DynamoDBmapper和DynamoDBQueryExpression查询全局辅助索引、按排序索引排序并返回前n个结果的方法是什么? 关于在GSI上执行查询的当前正确方式的建议? 非常感谢!

  • 在RoboMongo(0.9.0-RC09)中运行以下mongo查询会给出正确的文档数量(使用游标计数函数),而迭代所有文档只会返回一小部分文档: 我们是否需要专门配置查询以返回所有文档?

  • 当我使用System.out.println静态方法时,下面的Java程序显示ArrayList中的所有元素。但是,当我在方法中返回列表时,它只显示ArrayList中的一个元素。我希望你能给我一些指点,让我知道你做错了什么:

  • 问题内容: 我正在尝试使用以下查询获取每天打开的页面数。 我得到的输出是这样的: 问题是,在我的日表中,我有一列包含数字1到30来表示一个月中的天数。我进行了左外部连接,希望在天数列中显示所有天数! 但是我的查询正在这样做,为什么会这样呢? 谢谢大家的帮助。 问题答案: 解决方案是将WHERE更改为AND,以便该条件成为联接条件的一部分,而不是联接之后应用的过滤器: 现在,左表中的所有行都将出现在

  • 当我尝试时,我得到以下响应: 当我尝试从本地vuejs应用程序调用云函数时,我会得到以下错误: