如何使用主要和全局二级索引查询dynamo-db

时间:2017-05-02 09:15:09

标签: amazon-web-services amazon-dynamodb

我有这个dynamodb查询:

aws dynamodb create-table --table-name learnerpal-units-dev --attribute-definitions AttributeName=unitID,AttributeType=S AttributeName=ownerName,AttributeType=S --key-schema AttributeName=unitID,KeyType=HASH --global-secondary-indexes IndexName=unitOwnerIndexDev,KeySchema=["{AttributeName=ownerName,KeyType=HASH}"],Projection="{ProjectionType=ALL}",ProvisionedThroughput="{ReadCapacityUnits=1,WriteCapacityUnits=1}" --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 --endpoint-url http://localhost:8000

我希望它只返回一行具有唯一的unitID及其所有者。但是返回的数据在unitID方面并不是唯一的。它确实过滤了所有者。 unitID是主键(HASH),所有者是全局二级索引。

这是我的表:

let storyboard = UIStoryboard(name: "Main", bundle:nil)
            let frontviewcontroller = storyboard.instantiateViewControllerWithIdentifier(navigationcontrollerid) as? UINavigationController
            let rearViewController = storyboard.instantiateViewControllerWithIdentifier(id) as? UITableViewController
            let mainRevealController = SWRevealViewController()
            mainRevealController.frontViewController = frontviewcontroller
            mainRevealController.rearViewController = rearViewController
            self.window?.rootViewController = mainRevealController
            self.window?.makeKeyAndVisible()

1 个答案:

答案 0 :(得分:1)

请使用FilterExpression按非关键属性过滤数据。在上述情况下,unitID不是GSI中密钥的一部分。

以下params对我来说很好(即结果只有一个项目)。

var params = {
    TableName : table,
    IndexName : "unitOwnerIndexDev",
    KeyConditionExpression : 'ownerName= :hkey',
    FilterExpression : 'unitID = :unitIdVal',  
    ExpressionAttributeValues : {
        ':hkey' : 'owner1',
        ':unitIdVal' : '1'
    }
};