【问题标题】:How to Filter Nested Array Object in DynamoDB如何在 DynamoDB 中过滤嵌套数组对象
【发布时间】:2018-04-27 21:21:33
【问题描述】:

我是 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"
        }
    ]
}

我想检索与 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();

【问题讨论】:

  • 您可以使用分区键或分区键和排序键的组合从dynamodb表中获取数据。另一方面,您可以使用索引。
  • 我试过分区键和排序键没有帮助,我读到 DynamoDB 不支持此操作。我们可以查询对象属性,但不能查询对象数组属性。
  • 我更新了答案

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


【解决方案1】:

要通过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 属性的值,您可能需要重新建模数据以满足您的用例。

【讨论】:

  • 是的,谢谢,我已将数据改造成两个单独的数组。
  • 如果你保留两个独立的数组,你会如何关联姓名和电子邮件地址?
  • 这会比较整个对象,这很有用。我们如何只检查地图的一个字段?
【解决方案2】:

我认为您应该为用户和消息创建两个表

用户表有 partition_key: user_id 和 sort_key: email 和一个包含他的消息 id 数组的字段。

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

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

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

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

Docs

【讨论】:

  • 谢谢,我已将数据改造成两个单独的数组。但是DynamoDB中没有办法进行上述操作。
  • 您应该为此使用 documentClent
  • 我给了你一个链接
  • 是的,我使用了 documentClient 并尝试了您的解决方案,它确实有效,但我希望将数据作为单个文档。
  • 其实这是nosql数据库的一个特性。随意创建单独的表。这将有助于管理每张桌子的丢弃容量并节省您的资金。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2020-03-11
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
相关资源
最近更新 更多