簡體   English   中英

如何查詢 dynamoDB 字典中的特定值?

[英]How to query over specific value in dictionary in dynamoDB?

我有一個存儲在 dynamoDB 中的表,其示例字典如下:

 {event': 'A',
  'timestamp': '2017-10-15 16:20:47,009',
  'message': 'AAA'},
 {event': 'B',
  'timestamp': '2018-10-15 16:20:47,009',
  'message': 'BBB'},
 {event': 'A',
  'timestamp': '2019-10-15 16:20:47,009',
  'message': 'BBB'},
 {event': 'B',
  'timestamp': '2020-10-15 16:20:47,009',
  'message': 'AAA'},

我想做的事情:

  1. 查詢時間戳 - 在 2018 年之后只有字典
  2. 查詢消息 - 僅包含message == AAA的字典

讓我們專注於查詢消息:

我使用以下代碼加載表格:

import boto3
client = boto3.client("dynamodb", region_name="eu-central-1")
session = boto3.Session(profile_name="myprofile")
resource = session.resource("dynamodb", region_name="eu-central-1")
table = resource.Table("mytable")

我遇到的主要問題是,當我運行查詢代碼時:

response = table.query(
    KeyConditionExpression="message = :message",
    ExpressionAttributeValues={":message": "AAA"},
)

我收到以下錯誤:

ClientError: An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: event

我閱讀了有關此錯誤的一些信息,人們說我可以掃描表格(這在我的情況下是不可能的。因為我的整個表格很大)或使用二級索引(不幸的是我不明白它的意思)。 你能幫我解決這個問題嗎?

編輯

回答后我試着做:

response = table.query(
    KeyConditionExpression="message = :message",
    FilterExpression="#ts >:timestamp",
    ExpressionAttributeValues={":message": "AAA",
    ":timestamp": "2018-01-01 00:00:00"},
      ExpressionAttributeNames={
    "#ts": "timestamp"
  }
)

但我收到錯誤: ClientError: An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: event

如果不使用ExpressionAtrributeNames ,錯誤是相同的

要根據特定屬性的值查詢 DynamoDB 中的表,您需要在query方法的KeyConditionExpression參數中指定該屬性。

KeyConditionExpression參數定義表中的項目必須滿足的條件才能由查詢返回。

你的榜樣

response = table.query(
    KeyConditionExpression="message = :message",
    ExpressionAttributeValues={":message": "AAA"},
)

在此示例中,查詢只應返回message屬性等於"AAA"的項目。

解決方案

response = table.query(
    KeyConditionExpression="event = :event and message = :message",
    FilterExpression="#ts > :timestamp",
    ExpressionAttributeValues={
        ":event": "A",
        ":message": "AAA",
        ":timestamp": "2018-01-01 00:00:00",
    },
    ExpressionAttributeNames={
        "#ts": "timestamp",
    },
)

這個例子告訴你:

  1. FilterExpression參數指定查詢只應返回時間戳屬性大於“2018-01-01 00:00:00”的項目。 (由於您的錯誤,我們將timestamp關鍵字更改為ts 。)

  2. KeyConditionExpression參數指定查詢只應返回消息屬性等於“AAA”事件屬性等於“A”的項目。

  3. ExpressionAttributeValues參數定義將在KeyConditionExpressionFilterExpression參數中使用的值。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM