gpt4 book ai didi

amazon-dynamodb - 使用值列表查询 DynamoDB GSI

转载 作者:行者123 更新时间:2023-12-03 23:54:19 24 4
gpt4 key购买 nike

我有一个“团队成员”表,主分区键为“team_id”,主排序键为“email”,GSI 的分区键为“email”。

给定一个电子邮件列表,我想以最有效的方式找到列表中所有电子邮件的所有成员资格。

我知道对于一封电子邮件,我可以执行以下操作:

 Membership membership = new Membership();
membership.setEmail(email.toLowerCase());

DynamoDBQueryExpression<Membership> expression = new DynamoDBQueryExpression<Membership>()
.withHashKeyValues(membership)
.withIndexName(EMAIL_INDEX)
.withConsistentRead(false);

return mapper.query(Membership.class, expression);

它返回给定电子邮件的成员资格列表。

(因此对于我的电子邮件列表,我可以对列表中的每一封电子邮件执行上述操作,但我想知道是否可以一步完成)。

我希望能够执行以下操作:
List<Membership> memberships = allEmails.stream().map(email -> {
Membership m = new Membership();
m.setEmail(email.toLowerCase());
return m;
}).collect(Collectors.toList());

DynamoDBQueryExpression<Membership> expression = new DynamoDBQueryExpression<Membership>()
.withHashKeyValues(memberships) // <--- passing a list
.withIndexName(EMAIL_INDEX)
.withConsistentRead(false);

这显然不起作用。

有哪些替代方案?

最佳答案

Batch get item api 可用于从主表中获取多个分区键。但是,它不能用于从 GSI 获取多个项目。

我很欣赏这个答案可能无法解决您的问题。简而言之,没有其他替代解决方案。

Batch get item java

try {

TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes(forumTableName);
// Add a partition key
forumTableKeysAndAttributes.addHashOnlyPrimaryKeys("Name", "Amazon S3", "Amazon DynamoDB");

TableKeysAndAttributes threadTableKeysAndAttributes = new TableKeysAndAttributes(threadTableName);
// Add a partition key and a sort key
threadTableKeysAndAttributes.addHashAndRangePrimaryKeys("ForumName", "Subject", "Amazon DynamoDB",
"DynamoDB Thread 1", "Amazon DynamoDB", "DynamoDB Thread 2", "Amazon S3", "S3 Thread 1");

System.out.println("Making the request.");

BatchGetItemOutcome outcome = dynamoDB.batchGetItem(forumTableKeysAndAttributes,
threadTableKeysAndAttributes);

Map<String, KeysAndAttributes> unprocessed = null;

do {
for (String tableName : outcome.getTableItems().keySet()) {
System.out.println("Items in table " + tableName);
List<Item> items = outcome.getTableItems().get(tableName);
for (Item item : items) {
System.out.println(item.toJSONPretty());
}
}

// Check for unprocessed keys which could happen if you exceed
// provisioned
// throughput or reach the limit on response size.
unprocessed = outcome.getUnprocessedKeys();

if (unprocessed.isEmpty()) {
System.out.println("No unprocessed keys found");
}
else {
System.out.println("Retrieving the unprocessed keys");
outcome = dynamoDB.batchGetItemUnprocessed(unprocessed);
}

} while (!unprocessed.isEmpty());

}
catch (Exception e) {
System.err.println("Failed to retrieve items.");
System.err.println(e.getMessage());
}

关于amazon-dynamodb - 使用值列表查询 DynamoDB GSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51561223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com