【发布时间】:2022-01-08 00:54:11
【问题描述】:
在尝试使用适用于 JS 的 AWS 开发工具包(版本 2.1051.0)在 Lambda 函数中实施 DynamoDB 扫描时,我遇到了一些意外行为。
上下文:
我有一个名为 group 的 DynamoDB 表,其中只有一项。对象的主键是_id,但我想扫描所有对象并希望通过另一个名为groupOwner 的属性进行过滤。
预期行为:
我实现了一个如下所示的函数。它应该检索属性groupOwner 等于john 的Dynamo DB 表的所有项目。 (这恰好适用于表中唯一的项目。)
const db = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: "group",
ExpressionAttributeValues: {
':username': {
S: "john"
}
},
FilterExpression: 'groupOwner = :username'
};
console.log("Params: "+JSON.stringify(params))
const queryResponse = await db.scan(params).promise();
console.log("Query response: "+ JSON.stringify(queryResponse))
在查询响应中,我希望找到唯一的对象作为结果。
观察到的行为
根据 Cloudwatch 日志,扫描 + 过滤器会产生一个空响应。查询响应中没有项目:
2022-01-07T15:56:01.822Z f20009ef-067a-4b7f-9c5c-fe34b80167ca INFO Params: {
"TableName": "group",
"ExpressionAttributeValues": {
":username": {
"S": "john"
}
},
"FilterExpression": "groupOwner = :username"
}
2022-01-07T15:56:02.363Z f20009ef-067a-4b7f-9c5c-fe34b80167ca INFO Query response: {
"Items": [],
"Count": 0,
"ScannedCount": 1
}
现在是晦涩的部分
我很自然地认为我弄乱了过滤器表达式并进行了修补。但是在一些失败的尝试之后,我尝试使用 AWS 控制台和 AWS CLI 重新创建问题。使用相同的参数,两种替代解决方案都会产生正确的响应。
AWS CLI
运行下面的命令会返回过滤后的对象。请注意,所有参数都与AWS SDK中的相同。
aws dynamodb scan --table-name group \
--expression-attribute-values '{":username":{"S": "john"}}' \
--filter-expression "groupOwner = :username" \
--output json
输出:
{
"Items": [
{
"_id": {
"S": "a677968a-3d8b-40f2-806c-3ea32237b755"
},
"groupMember": {
"L": []
},
"groupName": {
"S": "My New Group"
},
"groupOwner": {
"S": "john"
},
"blockedMember": {
"L": []
}
}
],
"Count": 1,
"ScannedCount": 1,
"ConsumedCapacity": null
}
AWS 控制台
同样使用直观的 Web UI,我能够看到预期的结果: AWS console screenshot
现在怎么办?
我不明白为什么这个 JS sn-p 对我不起作用,我希望你能帮助我找出我做错了什么。
已经提前谢谢你了!
【问题讨论】:
标签: javascript amazon-web-services amazon-dynamodb aws-sdk aws-sdk-js