Java 带GSI的dynamodb滤波器
因此,我有一个dynamo表,用于包含以下字段的员工 employeeid(主索引/散列键)Java 带GSI的dynamodb滤波器,java,c#,amazon-web-services,amazon-dynamodb,Java,C#,Amazon Web Services,Amazon Dynamodb,因此,我有一个dynamo表,用于包含以下字段的员工 employeeid(主索引/散列键) 其他人ID(GSI) 名字(GSI) 姓氏 电子邮件 dob 秘钥 地址 电话 电子邮件(GSI) 除了上面的内容外,我无法在任何其他字段上创建gsi 我需要做的是搜索具有相同特征的员工 firstname、lastname、dob和secretkey,如果我没有,那么我需要插入一名新员工,如果我需要执行操作 在dynamodb中有没有一种方法可以使用c#搜索这4个字段? 我在firstname上有一个
其他人ID(GSI)
名字(GSI)
姓氏
电子邮件
dob
秘钥
地址
电话
电子邮件(GSI)
除了上面的内容外,我无法在任何其他字段上创建gsi 我需要做的是搜索具有相同特征的员工
firstname、
lastname、
dob
和secretkey,
如果我没有,那么我需要插入一名新员工,如果我需要执行操作 在dynamodb中有没有一种方法可以使用c#搜索这4个字段?
我在firstname上有一个gsi,我不想使用允许我使用过滤器的扫描,有没有一种方法可以在不扫描表的情况下使用我的firstname gsi进行查询或过滤 如有任何建议,将不胜感激 谢谢你的阅读 更新 这是我在c中尝试的#
var request=newqueryrequest()
{
TableName=“employee”,
IndexName=“firstName employeeId index”,
选择=选择所有属性,
ScanIndexForward=false
};
字符串键条件表达式;
字典表达式attributevalues=新字典();
keyConditionExpression=“firstName=:firstName和lastName=:lastName”;
expressionAttributeValues.Add(“:firstName”,新的AttributeValue{S=firstName});
expressionAttributeValues.Add(“:lastName”,新的AttributeValue{S=lastName});
request.KeyConditionExpression=KeyConditionExpression;
request.ExpressionAttributeValues=ExpressionAttributeValues;
var result=wait Client.QueryAsync(请求);
当我运行上面的程序查找hashkey时,出现了一个错误。您可以直接查询辅助索引。请参阅下面的示例Java代码
此外,我建议您考虑将所有字段作为查询结果的一部分保留在GSI本身中,因为它会给您带来良好的性能。这完全取决于您的用例。这只是一个建议,考虑到您在本文中概述的一个场景
参考此List queryResultJson=new ArrayList();
DynamoDB DynamoDB=新的DynamoDB(DynamoDB客户端);
Table Table=dynamoDB.getTable(“Table_name”);
Index=table.getIndex(“indexname”);
ItemCollection items=null;
QuerySpec QuerySpec=新QuerySpec();
querySpec.withKeyConditionExpression(“firstname=:val1”)
.withValueMap(新的ValueMap()
.使用字符串(“:val1”,fname));
items=index.query(querySpec);
迭代器Iterator=items.Iterator();
while(itemIterator.hasNext()){
添加(itemIterator.next().toJSON());
}
我发布的问题代码缺少一行,我发现,下面是我正在寻找的内容
var request = new QueryRequest()
{
TableName = "employee",
IndexName = "firstName-employeeId-index",
Select = Select.ALL_ATTRIBUTES,
ScanIndexForward = false
};
String keyConditionExpression;
Dictionary<string, AttributeValue> expressionAttributeValues = new Dictionary<string, AttributeValue>();
keyConditionExpression = "firstname = :firstname";
expressionAttributeValues.Add(":firstname", new AttributeValue { S = firstname });
expressionAttributeValues.Add(":lastName", new AttributeValue { S = lastname });
request.KeyConditionExpression = keyConditionExpression;
request.FilterExpression = "lastname = :lastname";
request.ExpressionAttributeValues = expressionAttributeValues;
var result = await Query<EmployeeDataModel>(Client, request);
var request=newqueryrequest()
{
TableName=“employee”,
IndexName=“firstName employeeId index”,
选择=选择所有属性,
ScanIndexForward=false
};
字符串键条件表达式;
字典表达式attributevalues=新字典();
keyConditionExpression=“firstname=:firstname”;
expressionAttributeValues.Add(“:firstname”,新的AttributeValue{S=firstname});
expressionAttributeValues.Add(“:lastName”,新的AttributeValue{S=lastName});
request.KeyConditionExpression=KeyConditionExpression;
request.filtereexpression=“lastname=:lastname”;
request.ExpressionAttributeValues=ExpressionAttributeValues;
var结果=等待查询(客户端、请求);
索引名是否为gsi索引名?您的答案将与Java一起使用,我在C#上找到了我的解决方案,我将很快发布C#解决方案,谢谢您的回复!缺少的行,request.FilterExpression=“lastname=:lastname”;
List<String> queryResultJson = new ArrayList<>();
DynamoDB dynamoDB = new DynamoDB(dynamoDBClient);
Table table = dynamoDB.getTable("table_name");
Index index = table.getIndex("indexname");
ItemCollection<QueryOutcome> items = null;
QuerySpec querySpec = new QuerySpec();
querySpec.withKeyConditionExpression("firstname = :val1")
.withValueMap(new ValueMap()
.withString(":val1", fname));
items = index.query(querySpec);
Iterator<Item> itemIterator = items.iterator();
while (itemIterator.hasNext()) {
queryResultJson.add(itemIterator.next().toJSON());
}
var request = new QueryRequest()
{
TableName = "employee",
IndexName = "firstName-employeeId-index",
Select = Select.ALL_ATTRIBUTES,
ScanIndexForward = false
};
String keyConditionExpression;
Dictionary<string, AttributeValue> expressionAttributeValues = new Dictionary<string, AttributeValue>();
keyConditionExpression = "firstname = :firstname";
expressionAttributeValues.Add(":firstname", new AttributeValue { S = firstname });
expressionAttributeValues.Add(":lastName", new AttributeValue { S = lastname });
request.KeyConditionExpression = keyConditionExpression;
request.FilterExpression = "lastname = :lastname";
request.ExpressionAttributeValues = expressionAttributeValues;
var result = await Query<EmployeeDataModel>(Client, request);