我的DynamoDB表alexas
的此项带有键“ abc”,如下面的DynamoDB控制台所示:
但是,以下查询未返回结果:
const params = { TableName: "alexas",
KeyConditionExpression: "deviceId = :deviceId",
ExpressionAttributeValues: { ":deviceId": "abc"}
}
const docClient = new AWS.DynamoDB.DocumentClient();
docClient.query(params, (err, data) => {
if (err) {
console.error(err);
} else {
console.log(data);
}
});
以上代码为null
和err
返回了data
:
{ Items: [], Count: 0, ScannedCount: 0 }
我是DynamoDB表达式风格的新手。我从here取得的代码有什么问题。
如果我使用query
方法而不是scan
,而在TableName
中只有params
,则会在表中获取项目。这确认我正在对具有数据的正确表执行操作。
答案 0 :(得分:3)
由于键值不匹配,查询没有返回任何数据。
项目的deviceId
是字符串"abc"
,而不是abc
。请注意多余的引号。
该项目是使用DynamoDB控制台的“创建”编辑器插入的,并且如果已经期望该值属于字符串类型,则无需包括""
。
答案 1 :(得分:0)
DynamoDB的Scan
操作不采用KeyConditionExpression
-仅Query
操作采用此参数。扫描始终会扫描整个表格,并且有FilterExpression
可以对这些结果进行后期过滤(但是请注意,您仍然需要为扫描整个表格付费)。
例如,这是Scan的官方文档:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
答案 2 :(得分:0)
选中QueryAPI
const params = { TableName: "alexas",
KeyConditionExpression: "deviceId = :deviceId",
ExpressionAttributeValues: {
":devideId":{
S: "abc", // here
}
}
}
const docClient = new AWS.DynamoDB.DocumentClient();
docClient.query(params, (err, data) => {
if (err) {
console.error(err);
} else {
console.log(data);
}
});
ExpressionAttributeValues
需要以其他方式传递。
更新: 尝试使用Exp属性名称,(我不确定是否会有所不同)
var params = {
TableName: "alexas",
KeyConditionExpression: "#d = :dId",
ExpressionAttributeNames:{
"#d": "email"
},
ExpressionAttributeValues: {
":dId": "abc"
}
};