{
{
"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, она не возвращает вам часть Item, она возвращает вам весь Item в зависимости от вашего выражения фильтра.Тем не менее я попытаюсь объяснить, как вы можете заставить его работать.
Поскольку каждый элемент в вашей таблице содержит ключ «Счета», в котором в качестве значения указан список.Вы можете использовать выражение «filterAttribute», но это только для списков, содержащих строковые значения, например, ниже
{
"movie": "XYZ",
"country": "India",
"information": {
"actors": [
"ABC"
],
"genres": [
"Action"
"Romance",
"Drama",
]
}
}
. Для этого вы можете использовать что-то вроде
response = table.scan(
FilterExpression=Attr('information.genres').eq('Romance')
)
Но какв вашем случае список содержит больше объектов, невозможно напрямую сканировать с использованием любого выражения фильтра.Вы должны реструктурировать свою базу данных таким образом, чтобы можно было применить фильтр для сканирования или вы можете отсканировать всю таблицу в одном объекте, а затем использовать функции языка программирования для фильтрации данных из вашего объекта данных.
Для реструктуризации я бы предложил вам небольшое изменение, которое будет полезно, так как ваш ключ «Аккаунты» - это список, содержащий объекты, которые имеют два поля «accountId» и «region».Вы можете изменить тип ключа «Счета» для объекта, и внутри этого объекта поддерживать два списка, один для «accountId» и один для «регионов», что-то вроде ниже:
{
"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"
Надеюсь, это поможет.