Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何从DynamoDB筛选(扫描)映射列表_Amazon Web Services_Aws Lambda_Amazon Dynamodb_Aws Sdk_Dynamodb Queries - Fatal编程技术网

Amazon web services 如何从DynamoDB筛选(扫描)映射列表

Amazon web services 如何从DynamoDB筛选(扫描)映射列表,amazon-web-services,aws-lambda,amazon-dynamodb,aws-sdk,dynamodb-queries,Amazon Web Services,Aws Lambda,Amazon Dynamodb,Aws Sdk,Dynamodb Queries,这是我的数据库结构 { "Accounts": [ { "accountId": "12345", "region": "us-east-1" } ], "createdBy": "abcd@gmail.com", } 我有几排类似的结构。我需要根据地区筛选帐户。有人能帮我做一下扫描的filterExpression吗?任何帮助都将不胜感激 { { "Accounts": [ {

这是我的数据库结构

{
  "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扫描表时,它不会返回项的一部分,它将根据您的筛选表达式返回整个项目。 不过,我还是会尽力解释一下你是如何做到这一点的

因为表中的每个项目都包含一个“Accounts”键,该键的值为列表。您可以使用contains filterAttribute表达式,但这仅适用于包含字符串值的列表,如下所示

{
    "movie": "XYZ",
    "country": "India",
    "information": {
        "actors": [
            "ABC"
        ],
        "genres": [
            "Action"
            "Romance",
            "Drama",
        ]
    }
}
为此,您可以使用以下内容

response = table.scan(
    FilterExpression=Attr('information.genres').eq('Romance')
)
但与您的情况一样,列表包含更多对象,无法直接使用任何筛选器表达式进行扫描。您必须以一种方式重新构造数据库,即可以应用过滤器进行扫描,或者可以在单个对象中扫描整个表,然后使用编程语言的功能从数据对象中过滤出数据

对于重组,我建议您做一个小的更改,这将非常有用,因为您的“Accounts”键是一个列表,其中包含两个字段“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],您的区域将出现在区域[0]中,如下所示。 现在您可以使用下面的筛选器表达式进行扫描

response = table.scan(
        FilterExpression=Attr('Accounts.region').contains('us-west-1')
    )
因此,这将返回在us-west-1中至少有帐户的项目,但您仍需要将其筛选出来,以便仅获取“us-west-1”中的帐户

希望能有帮助