2017-05-03 23 views
0

DynamoDBを使用するアプリケーションで作業しています。DynamoDBでの複雑なクエリ

複数の属性を持つGSIを作成する方法はありますか。私の目的は、以下の種類のクエリでテーブルを照会することです:

(attrA.val1 === someVal1 AND attrB.val2 === someVal2 AND attrC.val3 === someVal3) 
OR (attrA.val4 === someVal4 AND attrB.val5 === someVal5 AND attrC.val6 === someVal6) 

私たちはキー属性を持っており、キー属性が不明な場合、我々はScan操作を使用することができたときに我々はQueryを使用することができます知っています。キー以外の属性でクエリを実行する必要がある場合は、GSIも認識しています。しかし、私はこのシナリオでいくつかの助けが必要です。上記のクエリに合うようにGSIをモデル化する方法はありますか?

+0

上記の条件が満たされている場合にのみ、GSI上のアイテムを望んでいることを意味しますか?これは、RDBMSのビューと非常によく似ています。 – notionquest

+0

私は上記条件を満たすdynamobdテーブルから行を見つけようとしています。私はそれがテーブルかインデックスかどうかは気にしません。行は条件を満たす必要があります。 –

答えて

1

私のMoviesテーブルには、以下の項目(データ)があります。以下のクエリparamsは私のためにうまく動作します。

第3の属性をOPに追加することができます。それは正常に動作するはずです。

DynamoDBは、FilterExpressionの複合条件をサポートしています。いくつかの条件に基づいて

照会テーブル: -

var table = "Movies"; 

var year_val = 1991; 
var title = "Movie with map attribute"; 

var params = { 
    TableName : table, 
    KeyConditionExpression : 'yearkey = :hkey and title = :rkey', 
    FilterExpression : '(records.K1 = :k1Val AND records.K2 = :k2Val) OR (records.K3 = :k3Val AND records.K4 = :k4Val)',  
    ExpressionAttributeValues : { 
     ':hkey' : year_val, 
     ':rkey' : title, 
     ':k3Val' : 'V3', 
     ':k4Val' : 'V4',   
     ':k1Val' : 'V1', 
     ':k2Val' : 'V2' 

    } 
}; 

docClient.query(params, function(err, data) { 
    if (err) { 
     console.error("Unable to read item. Error JSON:", JSON.stringify(err, 
       null, 2));  
    } else { 
     console.log("GetItem succeeded:", JSON.stringify(data, null, 2)); 

    } 
}); 

マイデータ: -

enter image description here

結果: -

GetItem succeeded: { 
    "Items": [ 
    { 
     "title": "Movie with map attribute", 
     "yearkey": 1991, 
     "records": { 
     "K3": "V3", 
     "K4": "V4", 
     "K1": "V1", 
     "K2": "V2" 
     } 
    } 
    ], 
    "Count": 1, 
    "ScannedCount": 1 
} 
+0

完璧です。しかし、私の問題はここにあります。 'KeyConditionExpression'で一致させなければならない値を認識していないので、テーブルやGSIをどのようにモデル化しますか?私は上記の例を使用して、フィルタ式としてクエリを渡すことができます。しかし、私は 'KeyConditionExpression'が必要です。 –

+0

あなたは、あなたのモデル全体に​​関してOPに情報を提供していません。 OPは、DynamoDBを使用して複雑なクエリを記述できるかどうかを尋ねるだけです。すべての関連する属性を提供し、アクセスパターンを照会し、GSIをどのように設計できるかを尋ねなければなりません。 – notionquest