我编写了一个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。请告诉我如何做到这一点。
由于
答案 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;范围键。