Amazon dynamodb Dynamodb稀疏索引的实现

Amazon dynamodb Dynamodb稀疏索引的实现,amazon-dynamodb,Amazon Dynamodb,我是dynamodb的新手,我遇到过。我认为它们适合我的需要,但我不完全确定如何实施它们。在我的例子中,我有一个带有Post实体的表,它具有以下字段,如下所示: post_id <string> | user_id <string> | tags <string[]> | public <boolean>| other post data attributes... 如果您只需要属性的子集,稀疏索引就可以工作,您可以使用ProjectionTyp

我是dynamodb的新手,我遇到过。我认为它们适合我的需要,但我不完全确定如何实施它们。在我的例子中,我有一个带有Post实体的表,它具有以下字段,如下所示:

post_id <string> | user_id <string> | tags <string[]> | public <boolean>| other post data attributes...
如果您只需要属性的子集,稀疏索引就可以工作,您可以使用
ProjectionType:INCLUDES
将非关键属性包括到稀疏索引中(在您的示例中为:public attributes)。需要注意的是,在查询稀疏索引时,唯一可以访问的属性是显式包含的属性

首先,您需要在属性定义中声明这些公共属性

例如,其中一个公共属性是
userName
。 您希望添加:

 - AttributeName: userName
   AttributeType: S
然后,在
globalsecondaryindex
块中:

GlobalSecondaryIndexes:
  - IndexName: byUserIdAndPublic // You can name this whatever you'd like
    KeySchema:
      - AttributeName: userId
        KeyType: HASH
      - AttributeName: public
        KeyType: RANGE
      Projection:
        NonKeyAttributes:
        - userName
      ProjectionType: INCLUDE
然后,您只需专门查询该索引-在响应中,您将返回用户名(除了指定使用该索引外,不需要特殊的查询更改)

如果您需要每篇文章的所有属性,您需要使用
ProjectionType:all
,(然后只需删除
非关键属性
位)

下面是一个示例nodejs方法,该方法将按public筛选帖子(public是传递到该方法中的布尔值):

根据你的问题:

获取所有标记为公共的帖子

我认为您应该使用完整索引(
ProjectionType:ALL
),因为我可以想象您希望对一篇文章的所有属性进行索引。

如果您只需要属性的子集,则稀疏索引可以工作,您应该使用
ProjectionType:INCLUDES
将非键属性包含到稀疏索引中(在您的例子中:public attributes)。需要注意的是,在稀疏索引的查询中,您只能访问显式包含的属性

首先,您需要在属性定义中声明这些公共属性

例如,其中一个公共属性是
userName
。 您希望添加:

 - AttributeName: userName
   AttributeType: S
然后,在
globalsecondaryindex
块中:

GlobalSecondaryIndexes:
  - IndexName: byUserIdAndPublic // You can name this whatever you'd like
    KeySchema:
      - AttributeName: userId
        KeyType: HASH
      - AttributeName: public
        KeyType: RANGE
      Projection:
        NonKeyAttributes:
        - userName
      ProjectionType: INCLUDE
然后,您只需专门查询该索引-在响应中,您将返回用户名(除了指定使用该索引外,不需要特殊的查询更改)

如果您需要每篇文章的所有属性,您需要使用
ProjectionType:all
,(然后只需删除
非关键属性
位)

下面是一个示例nodejs方法,该方法将按public筛选帖子(public是传递到该方法中的布尔值):

根据你的问题:

获取所有标记为公共的帖子


我想您应该使用完整索引(
ProjectionType:ALL
),因为我想象你希望一篇文章的所有属性都被索引。

这可能是我误解了自己。公共字段被假定为布尔值,至少在关系数据库中,它将充当一个过滤器,仅获取public设置为true的实体。我不确定这是否与你在中的建议相同你的回答。啊-我确实误解了你。我以为你在问一种方法来索引所有公共帖子(在我的例子中,public确实是一个布尔值),然后只获取被认为是“public”的属性(在我的例子中:userName)。我将用QueryAy修改我的答案,我添加了一个示例查询。该索引存储所有帖子,但允许您按public=true或public=false进行查询。非常感谢您的帮助。是否可以在这样的表上进行查询,例如,我可以检查帖子是否包含标记:
KeyConditionExpression:'#public=:public和#userId=:userId和#tag CONTAINS tag'
我需要为tag创建另一个键吗?在阅读了有关我的用例的更多信息后,我想我需要的是复合排序键。我不确定如何使用无服务器框架定义复合排序键,我将为其提出另一个问题。再次感谢您的帮助。可能是我创建的我自己误解了。公共字段应该是一个布尔值,至少在关系数据库中是这样,它将充当一个过滤器,只获取公共设置为true的实体。我不确定这与您在回答中的建议是否相同。啊-我确实误解了您的意思。我以为您正在寻求一种方法来索引所有公共字段c posts(在我的示例中public实际上是一个布尔值),然后也只获取被认为是“public”的属性(在我的示例中:userName)。我将用QueryAy修改我的答案,我添加了一个示例查询。该索引存储所有帖子,但允许您按public=true或public=false进行查询。非常感谢您的帮助。是否可以在这样的表上进行查询,例如,我可以检查帖子是否包含标记:
KeyConditionExpression:'#public=:public和#userId=:userId和#tag CONTAINS tag'
我需要为tag创建另一个键吗?在阅读了有关我的用例的更多信息后,我想我需要的是复合排序键。我不确定如何使用无服务器框架定义复合排序键,我将提出另一个问题。再次感谢您的帮助。