2

私はDynamoDBデータベースにクエリするためにLambda(Python)を使用しています。私はboto3ライブラリを使用しています、と私は、「同等」のクエリを作ることができた:AWS DynamoDB Python - boto3 Key()メソッドが認識されない(クエリ)

このスクリプトは動作します:

import boto3 
from boto3.dynamodb.conditions import Key, Attr 
import json 

def create_list(event, context): 
    resource = boto3.resource('dynamodb') 
    table = resource.Table('Table_Name') 

    response = table.query(
     TableName='Table_Name', 
     IndexName='Custom-Index-Name', 
     KeyConditionExpression=Key('Number_Attribute').eq(0) 
    ) 
    return response 

しかし、私はこれにクエリ式を変更する場合:

KeyConditionExpression=Key('Number_Attribute').gt(0) 

私はエラーを取得する:

"errorType": "ClientError", 
    "errorMessage": "An error occurred (ValidationException) when calling the Query operation: Query key condition not supported" 

この[1]リソースによると、 "GT")は、キー(の方法です。このライブラリが更新されたか、あるいは "eq"以外の他のメソッドが利用可能であるかは誰にも知られていますか?

[1] http://boto3.readthedocs.io/en/latest/reference/customizations/dynamodb.html#ref-dynamodb-conditions

--------- EDIT ----------

Iはまた、ちょうど使用して、古い方法を試みた。

response = client.query(
     TableName = 'Table_Name', 
     IndexName='Custom_Index', 
     KeyConditions = { 
      'Custom_Number_Attribute':{ 
       'ComparisonOperator':'EQ', 
       'AttributeValueList': [{'N': '0'}] 
      } 
     } 
    ) 

これは働いたが、私がしようとすると:

response = client.query(
      TableName = 'Table_Name', 
      IndexName='Custom_Index', 
      KeyConditions = { 
       'Custom_Number_Attribute':{ 
        'ComparisonOperator':'GT', 
        'AttributeValueList': [{'N': '0'}] 
       } 
      } 
     ) 

...動作しません。

これらのケースでは、EQが唯一の方法であるのはなぜですか?私はドキュメントに何が欠けているのか分かりません。私が何を考えてから

+0

このドキュメントを参照すると仮定します。http://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#DynamoDB.Client.query – mootmoot

答えて

3

:(。あなたがeqを行うことができますし、それはそれである) あなたのパーティション・キーがNumber_Attributeあり、そしてあなたがgtqueryをやったときに行うことはできません

あなたはgtまたはbetweenを行うことができますqueryを実行しているときにソートキーを選択します。また、レンジキーと呼ばれ、それが「スマート」同士の横の項目を置くので、あなたがあなたのパーティションにbetweenを行いたい場合は、それが、今query

で効率的にgtbetweenを行うことの可能性を提供していますキー、あなたは以下のようなscanを使用する必要があります:

Key('Number_Attribute').gt(0) 
response = table.scan(
    FilterExpression=fe 
) 

は、以下に関するスキャンの点に注意してください。他の言葉でそう

The scan method reads every item in the entire table, and returns all of the data in the table. You can provide an optional filter_expression, so that only the items matching your criteria are returned. However, note that the filter is only applied after the entire table has been scanned.

、それはですクエリーと比較して少しコストがかかる操作です。ドキュメントhereに例があります。

希望に役立ちます!

+1

遅れて申し訳ありませんが、実際にはAWSサポート。あなたは正しく、 'eq'は主キーに必要です。この問題を解決する方法は、クエリするすべてのエントリに対して同じ値を保持する各テーブルに常に属性を追加することです。そうすれば、私はクエリを実行することができますし、一般的なクエリの項目をアクセシビリティから削除する(その一般的な属性の値を変更する)こともできます。これはスキャンと似ていますが、いくつかのオプションがあります。 – Feedslant

関連する問題