所以我有一个带有以下字段的员工的发电机表
employeeid(主索引/哈希键)
someotherid(GSI)
名字(GSI)
姓氏
电子邮件
DOB
秘密密钥
解决
手机
电子邮件(GSI)
除了上面的内容之外,我无法在任何其他字段上创建gsi。
我需要做的是搜索具有相同的员工
firstname,
lastname,
dob
和secretkey,
如果我没有,那么我需要插入新员工,如果我需要的话执行一项行动。
有没有一种方法在dynamodb中使用c#我可以搜索这4个字段?
我在名字上有一个gsi,我不想使用允许我使用过滤器的扫描,有没有办法查询或过滤使用我没有扫描的名字gsi表
任何建议都将受到赞赏。
感谢阅读。
更新
这是我在c#
中尝试过的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 and lastName = :lastName ";
expressionAttributeValues.Add(":firstName", new AttributeValue { S = firstName });
expressionAttributeValues.Add(":lastName", new AttributeValue { S = lastName });
request.KeyConditionExpression = keyConditionExpression;
request.ExpressionAttributeValues = expressionAttributeValues;
var result = await Client.QueryAsync(request);
当我查找我的哈希键时运行上面的内容时出错。
答案 0 :(得分:1)
我发布的问题代码丢失了一行我想出来了,下面就是我要找的内容。
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);
答案 1 :(得分:0)
您可以直接查询二级索引。请参阅以下示例Java代码。
另外,我建议您考虑将所有字段作为查询结果的一部分保留在GSI本身中,因为它会为您提供良好的性能。这一切都取决于您的用例。考虑到您在此主题中概述的一种情况,这只是一个建议。
请参阅此link
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());
}