如何在DynamoDB中过滤嵌套数组对象

时间:2017-11-14 19:47:07

标签: amazon-dynamodb aws-sdk-nodejs aws-sdk-js

我是AWS DynamoDB的初学者,我想用SENDTO.emailAddress =" first@first.com"扫描DynamoDB。作为FilterExpression。

数据库结构如下所示

{
    ID
    NAME
    MESSAGE
    SENDTO[
        {
            name
            emailAddress
        }
    ]
}

样本数据

{
    ID: 1,
    NAME: "HELLO",
    MESSAGE: "HELLO WORLD!",
    SENDTO: [
        {
            name: "First",
            emailAddress: "first@first.com"
        },
        {
            name: "Second",
            emailAddress: "second@first.com"
        }
    ]
}

我想检索与emailAddress匹配的文档。我尝试使用过滤器表达式扫描,这是我的代码来检索数据。我正在使用AWS Javascript SDK。

let params = {
    TableName : "email",
    FilterExpression: "SENDTO.emailAddress = :emailAddress",
    ExpressionAttributeValues: {
        ":emailAddress": "first@first.com",
    }
}

let result = await ctx.docClient.scan(params).promise();

2 个答案:

答案 0 :(得分:2)

要按sendto属性查找项目,您需要知道nameemailAddress属性值。 DynamoDB无法仅通过对象中的一个属性(即email属性值)来查找数据。

CONTAINS 函数可用于查找List数据类型中的数据。

  

列表支持CONTAINS:评估“a CONTAINS b”时,“a”   可以是一个清单;但是,“b”不能是集合,地图或列表。

使用包含的示例代码: -

var params = {
    TableName: "email",
    FilterExpression: "contains (SENDTO, :sendToVal)",
    ExpressionAttributeValues: {
        ":sendToVal": {
            "name" : "First",
            "emailAddress" : "first@first.com"
        }
    }
}; 

如果您不知道nameemailAddress属性的值,则可能需要重新构建数据以满足您的使用案例。

答案 1 :(得分:1)

我认为您应该为用户和邮件创建两个表

用户表包含partition_key:user_id和sort_key:email以及包含其邮件ID数组的字段。

消息表包含partition_key:message_id和包含用户ID数组的字段。

当您获得用户ID数组时,您可以使用 BATCH GET 查询来获取一条消息的所有用户。

当您获得消息ID数组时,您可以使用 BATCH GET 查询来获取一个用户的所有消息。

如果您想通过电子邮件获得一位用户,可以使用 QUERY 方法。

Docs