如何在DynamoDB中筛选嵌套的数组对象

9

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

数据库结构如下:

{
    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"
        }
    ]
}

我想检索符合电子邮件地址的文档。我尝试使用过滤器表达式进行扫描,这是我用来检索数据的代码。我正在使用AWS Javascript SDK。

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

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

您可以通过使用分区键或分区键和排序键的组合来从DynamoDB表中获取数据。另外,您也可以使用索引。 - Dmitry Grinko
我尝试了分区键和排序键,但并没有帮助。我读到DynamoDB不支持这个操作。我们可以查询对象属性,但不能查询对象数组属性。 - Narayanan Ramanathan
我更新了我的回答。 - Dmitry Grinko
2个回答

6
为了通过sendto属性查找项目,您需要知道nameemailAddress属性值。 DynamoDB无法仅通过对象中的一个属性(即仅email属性值)找到数据。 CONTAINS函数可以用于在列表数据类型中查找数据。

CONTAINS适用于列表:在评估“a CONTAINS b”时,“a”可以是一个列表; 但是,“b”不能是一个集合、映射或列表。

使用Contains的示例代码:
var params = {
    TableName: "email",
    FilterExpression: "contains (SENDTO, :sendToVal)",
    ExpressionAttributeValues: {
        ":sendToVal": {
            "name" : "First",
            "emailAddress" : "first@first.com"
        }
    }
}; 

如果您不知道nameemailAddress属性的价值,您可能需要重新设计数据以满足您的用例。


是的,谢谢。我已经将数据重构为两个单独的数组。 - Narayanan Ramanathan
如果您保留两个单独的数组,您将如何关联名称和电子邮件地址? - notionquest
2
这比较整个对象,可能很有用。我们如何检查地图中的一个字段? - foxtrotuniform6969

2
我认为你应该为用户和消息分别创建两个表格用户表格的 partition_key 是 user_id,sort_key 是 email,还有一个包含他所有消息 id 的字段。 消息表格的 partition_key 是 message_id,还有一个包含所有用户 id 的字段。
当你获得用户 id 数组时,可以使用BATCH GET查询来获取一个消息的所有用户。
当你获得消息 id 数组时,可以使用BATCH GET查询来获取一个用户的所有消息。
如果你想通过电子邮件获取一个用户,可以使用QUERY方法。 文档

谢谢,我已经将数据重构为两个单独的数组。但是在DynamoDB中没有办法执行上述操作。 - Narayanan Ramanathan
你应该使用documentClient来完成此操作。 - Dmitry Grinko
我给了你一个链接。 - Dmitry Grinko
是的,我使用了documentClient并尝试了您的解决方案,它确实有效,但我希望将数据作为单个文档。 - Narayanan Ramanathan
实际上这是nosql数据库的一个特性。可以随意创建单独的表格。这将有助于管理每个表格的容量,并节省您的资金。 - Dmitry Grinko
谢谢你的建议Dmitry,MongoDB支持它。 - Narayanan Ramanathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接