将dynamodb扫描转换为查询

时间:2018-02-04 13:49:49

标签: amazon-dynamodb

我编写了一个API网关来扫描一个dynamodb表并根据条件获取值,我的代码如下所示。

var params = {
        TableName: 'CarsData',
        FilterExpression: '#market_category = :market_category and #vehicle_size = :vehicle_size and #transmission_type = :transmission_type and #price_range = :price_range and #doors = :doors',
        ExpressionAttributeNames: {
            "#market_category": "market_category",
            "#vehicle_size": "vehicle_size",
            "#transmission_type": "transmission_type",
            "#price_range": "price_range",
            "#doors": "doors"
        },
        ExpressionAttributeValues: {
            ":market_category": body.market_category,
            ":vehicle_size": body.vehicle_size,
            ":transmission_type": body.transmission_type,
            ":price_range": body.price_range,
            ":doors": body.doors
        }
    }
    dynamodb.scan(params).promise().then(function (data) {
        var uw = data.Items;
        console.log(data + "\n" + JSON.stringify(data) + "\n" + JSON.stringify(data.Items));
        var res = {
            "statusCode": 200,
            "headers": {},
            "body": JSON.stringify(uw)
        };
        ctx.succeed(res);
    }).catch(function (err) {
        console.log(err);
        var res = {
            "statusCode": 404,
            "headers": {},
            "body": JSON.stringify({ "status": "error" })
        };
        ctx.succeed(res);
    });

当我运行此代码时,我得到了预期的结果。但是当我浏览一些在线论坛时,我发现扫描与查询相比是昂贵的。但我无法知道如何将查询从扫描更改为查询。这里我的主键是ID。请告诉我如何做到这一点。

由于

1 个答案:

答案 0 :(得分:1)

与查询操作相比,扫描操作在性能和成本方面更昂贵。 Dynamodb根据处理所消耗的读取容量单位数而不是返回的记录数计算成本。

查询操作根据主键(哈希)或复合主键(哈希键和排序键)查找值。

  

应使用复合主键(哈希键和排序键)重新设计架构。

Id 列作为主要密钥(如旧学校RDBMS)并不是必需的。如果您没有使用Id,请从架构中删除该列,并使用其他一些属性重新定义该列。举个例子,我使用市场类别(market_category)作为Hash Key&价格范围(price_range)为范围键。

var params = {
            "TableName": 'CarsData',
            "ConsistentRead": true,

            //Composite Primary Key in Key Condition Expression
            "KeyConditionExpression": "#market_category = :market_category AND #price_range = :price_range",

            //Remaining column in filter expression 
            "FilterExpression": '#vehicle_size = :vehicle_size and #transmission_type = :transmission_type and #doors = :doors',
            "ExpressionAttributeNames": {
                "#market_category": "market_category",
                "#vehicle_size": "vehicle_size",
                "#transmission_type": "transmission_type",
                "#price_range": "price_range",
                "#doors": "doors"
            },
            "ExpressionAttributeValues": {
                ":market_category": body.market_category,
                ":vehicle_size": body.vehicle_size,
                ":transmission_type": body.transmission_type,
                ":price_range": body.price_range,
                ":doors": body.doors
            }
        }

    dynamodb.query(params).promise()
        .then(function (data) {
            console.log(data);
        }).catch(function (err) {
            console.log(err);
        });

希望此示例能够为您提供有关使用复合主键的见解, 根据您的使用情况,选择广泛使用的Hash& amp;范围键。