【问题标题】:Filterexpression for DynamoDB Client for JS AWS SDK yields unexpected empty resultDynamoDB Client for JS AWS SDK 的过滤器表达式产生意外的空结果
【发布时间】: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


    【解决方案1】:

    您正在使用 SDK 的 DocumentClient,其中:

    通过抽象出属性值的概念来简化对 Amazon DynamoDB 中项目的处理。此抽象注释作为输入参数提供的原生 JavaScript 类型,并将带注释的响应数据转换为原生 JavaScript 类型

    将过滤器参数更改为:

    const params = {
        TableName: "group",
        ExpressionAttributeValues: {
            ":username": "john"
        },
        FilterExpression: "groupOwner = :username"
    };
    

    【讨论】:

    • 这解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多