Amazon dynamodb 将dynamodb扫描转换为查询
我已经编写了一个API网关来扫描dynamodb表,并根据条件获取值,我的代码如下所示Amazon dynamodb 将dynamodb扫描转换为查询,amazon-dynamodb,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 =
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。请告诉我怎么做
感谢就性能和成本而言,扫描操作比查询操作更昂贵。Dynamodb根据处理所消耗的读取容量单位的数量而不是返回的记录的数量来计算成本 查询操作根据主键(哈希)或复合主键(哈希键和排序键)查找值。 您的模式应该使用复合主键(散列键和排序键)重新设计 像老式的RDBMS一样,没有必要将列Id作为主键。如果您不使用Id,请从模式中删除该列,并使用其他一些属性重新定义它。例如,am使用市场类别(市场类别)作为散列键,使用价格范围(价格范围)作为范围键
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);
});
希望此示例能让您了解如何使用复合主键,
根据您的使用情况,为哈希和范围键选择广泛使用的列。扫描操作在性能和成本方面比查询操作更昂贵。Dynamodb根据处理所消耗的读取容量单位的数量而不是返回的记录的数量来计算成本 查询操作根据主键(哈希)或复合主键(哈希键和排序键)查找值。 您的模式应该使用复合主键(散列键和排序键)重新设计 像老式的RDBMS一样,没有必要将列Id作为主键。如果您不使用Id,请从模式中删除该列,并使用其他一些属性重新定义它。例如,am使用市场类别(市场类别)作为散列键,使用价格范围(价格范围)作为范围键
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);
});
希望此示例能让您了解如何使用复合主键,
根据您的使用情况,为哈希和范围键选择广泛使用的列