JS AWS SDK 的 DynamoDB 客户端的过滤器表达式产生意外的空结果
Filterexpression for DynamoDB Client for JS AWS SDK yields unexpected empty result
在尝试使用适用于 JS 的 AWS 开发工具包(版本 2.1051.0)在 Lambda 函数内实施 DynamoDB 扫描时,我遇到了一些意外行为。
上下文:
我有一个名为 group
的 DynamoDB table,其中只有一个项目。对象的主键是 _id
但我想扫描所有对象并希望按另一个名为 groupOwner
.
的属性进行过滤
预期行为:
我实现了一个如下所示的功能。它应该检索属性 groupOwner
等于 john
的 Dynamo DB table 的所有项目。 (这恰好适用于 table 的唯一项目。)
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 片段对我不起作用,我希望你能帮助我找出我做错了什么。
已经提前谢谢了!
您正在使用 SDK 的 DocumentClient,其中:
simplifies working with items in Amazon DynamoDB by abstracting away the notion of attribute values. This abstraction annotates native JavaScript types supplied as input parameters, as well as converts annotated response data to native JavaScript types
将过滤器参数更改为:
const params = {
TableName: "group",
ExpressionAttributeValues: {
":username": "john"
},
FilterExpression: "groupOwner = :username"
};
在尝试使用适用于 JS 的 AWS 开发工具包(版本 2.1051.0)在 Lambda 函数内实施 DynamoDB 扫描时,我遇到了一些意外行为。
上下文:
我有一个名为 group
的 DynamoDB table,其中只有一个项目。对象的主键是 _id
但我想扫描所有对象并希望按另一个名为 groupOwner
.
预期行为:
我实现了一个如下所示的功能。它应该检索属性 groupOwner
等于 john
的 Dynamo DB table 的所有项目。 (这恰好适用于 table 的唯一项目。)
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 片段对我不起作用,我希望你能帮助我找出我做错了什么。
已经提前谢谢了!
您正在使用 SDK 的 DocumentClient,其中:
simplifies working with items in Amazon DynamoDB by abstracting away the notion of attribute values. This abstraction annotates native JavaScript types supplied as input parameters, as well as converts annotated response data to native JavaScript types
将过滤器参数更改为:
const params = {
TableName: "group",
ExpressionAttributeValues: {
":username": "john"
},
FilterExpression: "groupOwner = :username"
};