0

我有以下情况,类似于这个 DynamoDB 表定义:

{
    "TableName": "Table",
    "KeySchema": [
        {
            "AttributeName": "Id",
            "KeyType": "HASH"
        },
        {
            "AttributeName": "CompoundSortKey",
            "KeyType": "RANGE"
        }
    ],
    "AttributeDefinitions": [
        {
            "AttributeName": "Id",
            "AttributeType": "S"
        },
        {
            "AttributeName": "CompoundSortKey",
            "AttributeType": "S"
        },      
        {
            "AttributeName": "AttributeId1",
            "AttributeType": "S"
        },
        {
            "AttributeName": "AttributeId2",
            "AttributeType": "S"
        }
    ],
    "LocalSecondaryIndexes": [
        {
            "IndexName": "Id-AttributeId1-index",
            "KeySchema": [
                {
                    "AttributeName": "Id",
                    "KeyType": "HASH"
                },
                {
                    "AttributeName": "AttributeId1",
                    "KeyType": "RANGE"
                }
            ],
            "Projection": {
                "ProjectionType": "ALL"
            }
        },
        {
            "IndexName": "Id-AttributeId2-index",
            "KeySchema": [
                {
                    "AttributeName": "Id",
                    "KeyType": "HASH"
                },
                {
                    "AttributeName": "AttributeId2",
                    "KeyType": "RANGE"
                }
            ],
            "Projection": {
                "ProjectionType": "ALL"
            }
        }
    ],
    "ProvisionedThroughput": {
        "ReadCapacityUnits": 5,
        "WriteCapacityUnits": 5
    }
}

除了定义的属性之外的每条记录都包含附加属性、具有少量属性的地图类型。

目前,我面临一种情况,我需要根据此映射中的一个属性检索记录,该属性是列表类型(准确地说,我需要查找在此列表中具有某些值的记录)。

我需要一个如何解决这个问题的建议,到目前为止,我已经阅读了有关全局二级索引的信息,但我不确定我的情况是否适用于它们,因为我需要基于列表类型进行过滤的属性。

我正在使用 C# 语言来获取记录,但我的问题很可能需要更改表定义。可能值得一提的是,我试图避免全表扫描操作。

更新:

该列表内的数据可以理解为“标签”。这意味着该表中的多个文档可能具有相同的标签。

我有一种情况,我必须过滤掉所有具有此特定标签的文档作为此列表中的元素之一

4

1 回答 1

0

您不能基于任意属性查询 DynamoDB。对于高效的查询,您需要一个索引:这意味着由表上的分区键 + 排序键形成的隐式索引,由分区键 + 一些其他属性作为排序键形成的本地索引,或者由桌子上的任何一两个属性。

问题:索引属性必须是字符串类型或数字类型 - 不支持将映射和列表作为索引属性。

这意味着如果您需要高效的查询,您必须重新考虑架构。将存储在列表中的值或要索引的映射属性必须转换为顶级字符串或数字属性。究竟如何做到这一点取决于您正在使用的数据的具体情况(问题中未指定)。

于 2019-08-21T19:01:29.133 回答