这是我的数据库结构
{
"Accounts": [
{
"accountId": "12345",
"region": "us-east-1"
}
],
"createdBy": "abcd@gmail.com",
}
我有几行类似的结构。我需要根据地区过滤帐户。任何人都可以帮助我使用 filterExpression 进行扫描吗?任何帮助,将不胜感激。
这是我的数据库结构
{
"Accounts": [
{
"accountId": "12345",
"region": "us-east-1"
}
],
"createdBy": "abcd@gmail.com",
}
我有几行类似的结构。我需要根据地区过滤帐户。任何人都可以帮助我使用 filterExpression 进行扫描吗?任何帮助,将不胜感激。
{
{
"Accounts": [
{
"accountId": "12345",
"region": "us-east-1"
},
],
"createdBy": "abcd@gmail.com",
},
{
"Accounts": [
{
"accountId": "98765",
"region": "us-west-1"
},
{
"accountId": "45678",
"region": "eu-west-2"
}
],
"createdBy": "pqrs@gmail.com",
},
}
当您的表格中存在两项(只是一个假设,如果我错了,请通知我)时,我假设这是您表格的数据。首先,如果您的表包含这样的项目,并且您需要从特定区域中的每个项目中过滤掉“帐户”,那么这是不可能的,因为您只要求项目的一部分,而实际上当您使用 filterExpressions 扫描表,它不会返回项目的一部分,它会根据您的过滤器表达式返回整个项目。我仍然会尝试解释如何使它工作。
因为您表中的每个项目都包含一个“帐户”键,该键具有一个列表作为值。您可以使用 contains filterAttribute 表达式,但这仅适用于包含字符串值的列表,如下所示
{
"movie": "XYZ",
"country": "India",
"information": {
"actors": [
"ABC"
],
"genres": [
"Action"
"Romance",
"Drama",
]
}
}
为此,您可以使用类似
response = table.scan(
FilterExpression=Attr('information.genres').eq('Romance')
)
但是在您的情况下,列表包含更多对象,因此无法直接使用任何过滤器表达式进行扫描。您必须以一种可以应用过滤器进行扫描的方式重组数据库,或者您可以在单个对象中扫描整个表,然后使用您的编程语言的功能从数据对象中过滤掉数据。
对于重组,我建议您进行一些小的更改,这将有所帮助,因为您的“帐户”键是一个列表,其中包含具有两个字段“accountId”和“region”的对象。您可以将“Accounts”键的类型更改为对象,并在该对象内部维护两个列表,一个用于“accountId”,一个用于“regions”,如下所示:
{
"Accounts": {
"accountId": ["12345", "23456", "98765"],
"region": ["us-east-1", "us-west-1", "eu-west-1"]
},
"createdBy": "abcd@gmail.com",
}
现在您有两个列表,因此对于 accountId[0],您的区域将像这样出现在 region[0] 中。现在您可以使用如下过滤器表达式进行扫描,
response = table.scan(
FilterExpression=Attr('Accounts.region').contains('us-west-1')
)
因此,这将返回在 us-west-1 中至少有一个帐户的项目,但您仍然需要将其过滤掉以仅获取“us-west-1”中的帐户
希望能帮助到你。