【问题标题】:convert a dynamodb scan to query将 dynamodb 扫描转换为查询
【发布时间】:2018-02-04 13:49:48
【问题描述】:

我编写了一个 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。请让我知道我该怎么做。

谢谢

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

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

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

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

    不必像老式 RDBMS 那样将列 Id 作为主键。如果您没有有效地使用 Id 从架构中删除该列并使用其他一些属性重新定义它。例如,我使用市场类别 (market_category) 作为哈希键和价格范围 (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 & Range 键选择广泛使用的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      相关资源
      最近更新 更多