DynamoDB GSI,范围键项目计数为0

时间:2016-05-21 04:06:51

标签: amazon-web-services key amazon-dynamodb

我在DynamoDB中有一个如下所示的表:

enter image description here

我在表格的“类别”中添加了一个全局二级索引,它工作正常,并在项目计数下给了我表中的项目数。

然后我意识到我实际上需要能够在特定的“类别”中搜索,但按“UserRating”排序

所以我删除了GSI并创建了一个新的:

enter image description here

这一切都运行正常我认为,正确的类别(字符串)的类别和(数字)UserRating的名称是正确的。

但是在完成创建GSI之后我看了一下控制台,它显示了项目数0,即使在这个测试表中应该有13个,如下图所示:

enter image description here

感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

我认为,当键模式类型和具体项目类型之间的类型简单不匹配时,更可能发生这种情况。

来自Managing Global Secondary Indexes-

  

注意

     

在某些情况下,由于违反索引键,DynamoDB无法将数据从表写入索引。如果属性值的数据类型与索引键架构数据类型的数据类型不匹配,或者属性的大小超过索引键属性的最大长度,则会发生这种情况。违反索引键不会干扰全局二级索引的创建;但是,当索引变为活动状态时,违反的键将不会出现在索引中。

     

DynamoDB提供了一个独立的工具来查找和解决这些问题。有关更多信息,请参见Detecting and Correcting Index Key Violations

通过示例

项目外观如下:

    "Items": [
    {
        "Timestamp": {
            "N": "1542475507"
        },
        "DevID": {
            "S": "slfhioh1234oi23lk23kl4h235pjpo235lnsfvuwerfj2roin2l3rn9fj9f8hwen"
        },
        "UID": {
            "S": "1"
        }
    }
],

索引如下:

  "GlobalSecondaryIndexes": [
        {
            "IndexName": "UID-Timestamp-index",
            "Projection": {
                "ProjectionType": "KEYS_ONLY"
            },
            "ProvisionedThroughput": {
                "WriteCapacityUnits": 1,
                "ReadCapacityUnits": 1
            },
            "KeySchema": [
                {
                    "KeyType": "HASH", 
                    "AttributeName": "UID"
                },
                {
                    "KeyType": "RANGE",
                    "AttributeName": "Timestamp"
                }
            ], 
        }
    ]

表具有属性定义:

"AttributeDefinitions": [
        {
            "AttributeName": "Timestamp",
            "AttributeType": "S"
        },
        {
            "AttributeName": "UID",
            "AttributeType": "S"
        }
    ]

该项目将显示在您的新索引中。

完全有可能类型不匹配(在这种情况下为“ S”!=“ N”),而不在创建时将其标记出来。这是有道理的。您可能想故意做这种事情,但是当您不小心这样做时-这不是很好。

答案 1 :(得分:0)

根据Amazon documentation,此更新大约每6小时进行一次。

  

ItemCount-全局二级索引中的项目数。 DynamoDB大约每六个小时更新一次该值。此值可能不会反映最近的更改。

就我而言,即使控制台仍显示ItemCount为零,并且没有为扫描/查询索引返回任何结果,我仍然能够从我的代码中成功查询它。

答案 2 :(得分:0)

当索引名称包含破折号时,我也有奇怪的行为(没有结果),如 OP 的屏幕截图所示。用下划线替换破折号解决了我的问题。

答案 3 :(得分:-1)

找到答案。我的读写容量设置为1个单位的所有内容,一旦我增加它修复错误,我可以看到项目。