带GSI的dynamodb滤波器

时间:2016-06-03 06:04:11

标签: java c# amazon-web-services amazon-dynamodb

所以我有一个带有以下字段的员工的发电机表

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);

当我查找我的哈希键时运行上面的内容时出错。

2 个答案:

答案 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());
    }