Amazon dynamodb 使用值列表查询DynamoDB GSI

Amazon dynamodb 使用值列表查询DynamoDB GSI,amazon-dynamodb,aws-sdk,Amazon Dynamodb,Aws Sdk,我有一个“团队成员”表,主分区键为“team_id”,主排序键为“email”,GSI的分区键为“email” 给定一个电子邮件列表,我想以最有效的方式找到列表中所有电子邮件的所有会员资格 我知道,对于一封电子邮件,我可以做到以下几点: Membership membership = new Membership(); membership.setEmail(email.toLowerCase()); DynamoDBQueryExpression<Membership> e

我有一个“团队成员”表,主分区键为“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);
Membership=newmembership();
setEmail(email.toLowerCase());
DynamoDBQueryExpression表达式=新的DynamoDBQueryExpression()
.withHashKeyValues(成员资格)
.withIndexName(电子邮件索引)
.具有一致性读取(错误);
返回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);
List memberships=allEmails.stream().map(电子邮件->{
成员m=新成员();
m、 setEmail(email.toLowerCase());
返回m;
}).collect(Collectors.toList());
DynamoDBQueryExpression表达式=新的DynamoDBQueryExpression()

.withHashKeyValues(memberships)//批处理获取项api可用于从主表获取多个分区键。但是,它不能用于从GSI获取多个项目


我理解这个答案可能无法解决您的问题。简单地说,没有其他替代解决方案

试试看{
TableKeysAndAttributes forumTableKeysAndAttributes=新的TableKeysAndAttributes(forumTableName);
//添加分区键
addHashOnlyPrimaryKeys(“名称”、“AmazonS3”、“AmazonDynamodB”);
TableKeysAndAttributes threadTableKeysAndAttributes=新的TableKeysAndAttributes(threadTableName);
//添加分区键和排序键
ThreadTableKeys和Attributes.addHashAndRangePrimaryKeys(“ForumName”、“Subject”、“Amazon DynamoDB”,
“DynamoDB线程1”、“Amazon DynamoDB”、“DynamoDB线程2”、“Amazon S3”、“S3线程1”);
System.out.println(“提出请求”);
BatchGetItemOutcome=dynamoDB.batchGetItem(用于表格键和属性,
螺纹表键和属性);
映射未处理=空;
做{
for(字符串表名:output.getTableItems().keySet()){
System.out.println(“表中项目”+表名);
List items=output.getTableItems().get(tableName);
用于(项目:项目){
System.out.println(item.toJSONPretty());
}
}
//检查未处理的密钥,如果超过
//供应
//吞吐量或达到响应大小的限制。
未处理=结果。getUnprocessedKeys();
if(unprocessed.isEmpty()){
System.out.println(“未找到未处理的密钥”);
}
否则{
System.out.println(“检索未处理的密钥”);
结果=dynamoDB.batchGetItemUnprocessed(未处理);
}
}而(!unprocessed.isEmpty());
}
捕获(例外e){
System.err.println(“检索项目失败”);
System.err.println(e.getMessage());
}

“我很感激这个答案可能无法解决您的问题。很简单,没有其他替代解决方案。”-我也很担心。谢谢你的回答。你的发现是什么?我也遇到了同样的问题。到目前为止,还无法从AWS文档中找到。你找到更好的解决办法了吗?对不起,我没有找到更好的办法。
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());
        }