Home > Software engineering >  How to use filter expressions on aws using python3 for nested map attribute?
How to use filter expressions on aws using python3 for nested map attribute?

Time:12-09

I have been trying to scan DynamoDB to check for particular value in a nested map attribute named deliverables. However using scan with filter expressions is resulting in an empty result.

import boto3
result = []
dynamo_client = boto3.client("dynamodb")
paginator = dynamo_client.get_paginator("scan")

operation_parameters = {
    'FilterExpression': "#Deliverable= :deliverable",
    'ExpressionAttributeNames': {
        '#Deliverable': 'deliverables.fc986523-a666-478e-8303-2a1c3c1dc4ba'
    },
    'ExpressionAttributeValues': {
    ':deliverable':  {
    "M": {
     "read": {
      "BOOL": True
     },
     "upload": {
      "BOOL": True
     },
     "write": {
      "BOOL": True
     }
    }
    }
  }
}
for page in paginator.paginate(TableName="TableName", **operation_parameters):
    result.append(page["Items"])

print(result)

The items in the dynamo db look like this:

[
   [
      {
         "deliverables":{
            "M":{
               "7397d832-fefb-4ba2-97a1-0f6e73d611d9":{
                  "M":{
                     "read":{
                        "BOOL":true
                     },
                     "upload":{
                        "BOOL":true
                     },
                     "write":{
                        "BOOL":true
                     }
                  }
               },
               "fc986523-a666-478e-8303-2a1c3c1dc4ba":{
                  "M":{
                     "read":{
                        "BOOL":true
                     },
                     "upload":{
                        "BOOL":true
                     },
                     "write":{
                        "BOOL":true
                     }
                  }
               }
            }
         },
         "username":{
            "S":"username1"
         },
         "deniedReferences":{
            "L":[
               
            ]
         }
      },
      {
         "deliverables":{
            "M":{
               "7397d832-fefb-4ba2-97a1-0f6e73d611d9":{
                  "M":{
                     "read":{
                        "BOOL":true
                     },
                     "upload":{
                        "BOOL":false
                     },
                     "write":{
                        "BOOL":false
                     }
                  }
               },
               "fc986523-a666-478e-8303-2a1c3c1dc4ba":{
                  "M":{
                     "read":{
                        "BOOL":true
                     },
                     "upload":{
                        "BOOL":false
                     },
                     "write":{
                        "BOOL":false
                     }
                  }
               }
            }
         },
         "username":{
            "S":"repositoryadmin"
         },
         "deniedReferences":{
            "L":[
               
            ]
         }
      }
   ]
]

Please let me know if you can help me solve this issue.

CodePudding user response:

The problem is the [dot] here: 'ExpressionAttributeNames': { '#Deliverable': 'deliverables.fc986523-a666-478e-8303-2a1c3c1dc4ba'}

Expressions docs: DynamoDB interprets a dot in an expression attribute name as a character within an attribute's name.

operation_parameters = {
    "FilterExpression": "#D0.#D1=:deliverable", # the dot goes here!
    "ExpressionAttributeNames": {
        "#D0": "deliverables",
        "#D1": "fc986523-a666-478e-8303-2a1c3c1dc4ba"
    },
  • Related