Wronski
Wronski

Reputation: 1606

DynamoDB filter if primary key contains value

CURRENTLY

I have a table in DynamoDB with a single attribute - Primary Key - that contains unique values.

PK
------
#A#B#C#
#B#C#
#C#D#E#
#BC#

ISSUE

I am looking to do 2 searches for #B#C# (1) exact match, and (2) containing match, and therefore only want results:

(1) Exact Match:
#B#C#

(2) Containing Match:
#A#B#C#
#B#C#
  1. Are these 2 searches possible against the primary key?
  2. If so, what is the most efficient query to run? e.g. QUERY or SCAN

Note:

For (2) I am using the following code, but it is returning all items in DB:

            params = {
                TableName: 'myTable',
                FilterExpression: "contains(#key, :v)",
                ExpressionAttributeNames: { "#key": "PK" },
                ExpressionAttributeValues: { ":v": #B#C# }
            }

            dynamodb.scan(params,callback)

Upvotes: 1

Views: 2382

Answers (1)

Seth Geoghegan
Seth Geoghegan

Reputation: 5747

DynamoDB supports two main types of searches: query and scan. The Query operation finds items based on primary key values. The Scan operation returns one or more items and item attributes by accessing every item in a table or a secondary index

If you wanted to find the item with a primary key #B#C, you would use the query API:

ddbClient.query(
  {
    "TableName": "<YOUR TABLE NAME>",
    "KeyConditionExpression": "#pk = :pk",
    "ExpressionAttributeValues": {
      ":pk": {
        "S": "#B#C"
      }
    },
    "ExpressionAttributeNames": {
      "#pk": "PK"
    }
  }
)

For your second access pattern, you'll need to use the scan API because you are searching across the entire table/secondary index.

You can use scan to test if a primary key has a substring using contains. I don't see anything wrong with the format of your scan operation.

Be careful when using scan this way. Because scan will read your entire table to fetch results, you will have a fairly inefficient operation at scale. If this operation is run infrequently, or you are running it against a sparse index, it's probably fine. However, if it's one of your primary access patterns, you may want to reconsider using the scan API for this operation.

Upvotes: 2

Related Questions