DynamoDB 在地图或列表类型上创建索引

问题描述 投票:0回答:2

我正在尝试向 DynamoDB 中地图对象内部的属性添加索引,但似乎找不到方法。这是受支持的东西还是索引真的只允许在标量值上?与此相关的文档似乎相当稀疏。我希望索引功能与 MongoDB 类似,但到目前为止,我采用的使用点语法引用属性进行索引的方法尚未成功。任何可以提供的帮助或附加信息将不胜感激。

amazon-web-services amazon-dynamodb
2个回答
53
投票

索引只能基于顶级 JSON 属性构建。此外,范围键必须是 DynamoDB 中的标量值(字符串、数字、二进制或布尔值之一)。

来自 https://docs.aws.amazon.com/whitepapers/latest/comparing-dynamodb-and-hbase-for-nosql/indexing.html

问:在 DynamoDB 中查询 JSON 数据有什么不同吗?

不。您可以创建全局二级索引或本地二级索引 在任何顶级 JSON 元素上。例如,假设您存储了一个 JSON 包含有关某人的以下信息的文档: 名字、姓氏、邮政编码以及所有朋友的列表。 名字、姓氏和邮政编码将是顶级 JSON 元素。 您可以创建一个索引,让您根据名字、姓氏进行查询 姓名或邮政编码。好友列表不是顶级元素, 因此您无法索引好友列表。了解更多信息 有关全局二级索引及其查询功能,请参阅 本常见问题解答中的二级索引部分。

问:哪些数据类型可以被索引?

所有标量数据类型(数字、字符串、二进制和布尔值)都可以 用于本地二级索引键的范围键元素。放, 列表和地图类型无法建立索引。


2
投票

我尝试在单独存储对象时执行 hash(str(object)) 。这个哈希给了我一个整数(Number),我可以在它上使用二级索引。 下面是Python中的示例,使用哈希函数非常重要,该函数每次都会为值生成相同的哈希键。所以我用的是sha1。

# Generate a small integer hash:
import hashlib
def hash_8_digits(source):
    return int(hashlib.sha1(source.encode()).hexdigest(), 16) % (10 ** 8)

这个想法是保持整个对象很小,同时保持实体完整。即,不是将对象序列化并存储为字符串并更改对象的整个使用方式,而是将较小的哈希值与实际列表或映射一起存储。

© www.soinside.com 2019 - 2024. All rights reserved.