我在DynamoDB中有一个如下所示的表:
我在表格的“类别”中添加了一个全局二级索引,它工作正常,并在项目计数下给了我表中的项目数。
然后我意识到我实际上需要能够在特定的“类别”中搜索,但按“UserRating”排序
所以我删除了GSI并创建了一个新的:
这一切都运行正常我认为,正确的类别(字符串)的类别和(数字)UserRating的名称是正确的。
但是在完成创建GSI之后我看了一下控制台,它显示了项目数0,即使在这个测试表中应该有13个,如下图所示:
感谢您的帮助。
答案 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个单位的所有内容,一旦我增加它修复错误,我可以看到项目。