Node.js 如何使用AWS Lambda按名称查询dynamoDB表
我有dynamoDB桌 表名Node.js 如何使用AWS Lambda按名称查询dynamoDB表,node.js,amazon-web-services,amazon-dynamodb,aws-lambda,Node.js,Amazon Web Services,Amazon Dynamodb,Aws Lambda,我有dynamoDB桌 表名xx 主分区键id(编号) 主排序键名称(字符串) 我想通过name查询它 'use strict'; const AWS = require("aws-sdk"); const dynamodb = new AWS.DynamoDB(); const docClient = new AWS.DynamoDB.DocumentClient(); exports.handler = function(event, ctx, callback) { var p
xx
主分区键id
(编号)
主排序键名称
(字符串)
我想通过name
查询它
'use strict';
const AWS = require("aws-sdk");
const dynamodb = new AWS.DynamoDB();
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, ctx, callback) {
var params = {
TableName: 'xx',
KeyConditionExpression: "#name = :name",
ExpressionAttributeNames:{
"#name": "name"
},
ExpressionAttributeValues: {
":name":event.name
}
};
docClient.query(params, function(err, data){
if(err){
callback(err, null);
}else{
callback(null, data);
}
});
}
但我遇到了一个错误:“查询条件缺少关键模式元素:id:”如何处理 DynamoDB是一个NoSQL数据库,因此默认情况下只能查询主键。您有两个选择:
- 创建全局二级索引并对其进行查询(): 全局辅助索引包含从基表中选择的属性,但它们由不同于表的主键组织。索引键不需要具有表中的任何键属性;甚至不需要具有与表相同的键架构
- 扫描而不是查询:
var params= { TableName:'xx', ProjectionExpression:'name', // remove this string if you want to get not only 'name' FilterExpression:'name = :name', ExpressionAttributeValues:{ ":name" : event.name } }; docClient.scan(params, function(err, data){ if(err){ callback(err, null); }else{ callback(null, data); } });
如果您的表不会太大,那么扫描是一种更简单、更便宜的方法(我相信全局二级索引有相关的成本),但“正确”的方法是使用全局二级索引。事实上,这是导致解决方案的唯一答案。也许我是瞎的,但我没有发现关于只使用主键的查询的任何信息。非常非常感谢。