首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DynamoDb检查给定SS中包含的SS属性

DynamoDb检查给定SS中包含的SS属性
EN

Stack Overflow用户
提问于 2021-01-18 14:44:55
回答 2查看 336关注 0票数 0

假设我有这样的模式:

代码语言:javascript
复制
source_id              -> String, HashKey
created_at             -> String, RangeKey
required_capabilities  -> StringSet

required_capabilities是一组字符串,为了能够检索特定的元素,我们需要在查询中提供这些字符串。

例如:如果我有这三个元素:

代码语言:javascript
复制
{
  "source_id": "1",
  "created_at": "2021-01-18T10:53:25Z",
  "required_capabilities": ["Cap1", "Cap2", "Cap3"]
},
{
  "source_id": "1",
  "created_at": "2021-01-18T10:59:31Z",
  "required_capabilities": ["Cap1", "Cap3"]
},
{
  "source_id": "1",
  "created_at": "2021-01-18T11:05:15Z"
}

我希望创建一个查询,例如过滤source_id = "1“,并提供一个带有required_capabilities = ["Cap1", "Cap3", "Cap4"]的FilterExpression。

因此,我希望:

代码语言:javascript
复制
{
  "source_id": "1",
  "created_at": "2021-01-18T10:59:31Z",
  "required_capabilities": ["Cap1", "Cap3"] // Since I've provided "Cap1", "Cap3" and "Cap4"
},
{
  "source_id": "1",
  "created_at": "2021-01-18T11:05:15Z" // Since it doesn't require any capability.
}

我尝试了IN操作符,因为存储的StringSet应该是IN (或包含在)给定的SS中,但是它没有工作。

aws dynamodb query --table-name TableName --key-condition-expression "source_id = :id" --filter-expression "required_capabilities IN (:rq)" --expression-attribute-values '{":id": {"S": "1"}, ":rq": { "SS": ["Cap1", "Cap3", "Cap4"] }}'

只有当我提供完全相同的StringSet时,它才能工作,但是如果我提供的集合包含保存的值,并且具有更多的值,则不会返回任何内容。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-27 13:45:06

实际上,我发现dynamodb不支持我需要的用例,所以我找到了解决办法。

基本上,我没有将required_capabilities建模为StringSet,而是创建了一个名为required_capability的字段,其中包含一个所需的功能(到目前为止,这对我来说还可以),并使用IN操作符进行检查。

如果将来我需要检查一个以上的功能,我只需要添加新字段required_capability_2required_capability_3

这显然不是理想的,但我想这已经足够好了,考虑到我不会在一张唱片中拥有很多所需的功能,通常是一张,也许是两张。

票数 0
EN

Stack Overflow用户

发布于 2021-01-18 20:10:09

您的问题似乎是关于IN关键字的使用,它不适用于sets。来自附加条件的医生

IN :检查列表中匹配的元素。AttributeValueList可以包含一个或多个类型为字符串、数字或二进制元素。将这些属性与项的现有属性进行比较。如果输入的任何元素等于item属性,则表达式的计算结果为true。

我相信您想要CONTAINS关键字:

包含:检查子序列,或在集合中值。AttributeValueList只能包含一个字符串、数字或二进制类型的AttributeValue元素(而不是set类型)。如果比较的目标属性为String类型,则操作符将检查子字符串匹配。如果比较的目标属性为二进制类型,则运算符将查找与输入匹配的目标的子序列。如果比较的目标属性是set ("SS“、"NS”或"BS"),则如果与集合的任何成员完全匹配,则运算符的计算结果为true。list支持can :当计算"a包含b“时,"a”可以是列表;但是,"b“不能是集、映射或列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65776696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档