2017-07-27 8 views
1

以下の形式のdynamodbテーブルからマップのリストをフィルタリングしようとしています。DynamoDBのクエリリスト

{ 
    id: "Number", 
    users: { 
     { userEmail: [email protected], age:"23" }, 
     { userEmail: [email protected], age:"41" } 
    } 
} 

userEmailを使用して、ユーザーのデータを「[email protected]」として取得する必要があります。現在、以下のdynamodbクエリを使用しています。この問題を解決するための効率的な方法がありますか?

var params = { 
     TableName: 'users', 
     Key:{ 
      'id': id 
     } 
    }; 
    var docClient = new AWS.DynamoDB.DocumentClient(); 
    docClient.get(params, function (err, data) { 
    if (!err) { 
     const users = data.Item.users; 
     const user = users.filter(function (user) { 
     return user.email == userEmail; 
     }); 
     // filtered has the required user in it 
    }); 

答えて

1

パーティションキーを持つテーブルがある場合は、idでダイナモ内の単一アイテムを得ることができる唯一の方法。だから、見えるテーブルを持っている必要がありますように:

メール(文字列) - キーパーティション

Idを(いくつかの型) - ユーザーID

...他の関連するユーザーデータ

残念ながら、ネストされたフィールドはパーティションキーにはなりませんので、ここで別のテーブルを管理する必要があり、DynamoDB(LSIもGSIもない)でインデックスを使用することはできません。

NoSQLではデータを複製するのが一般的なパターンなので、珍しいことはありません。 Javaを使用している場合は、transactions libraryを使用して、両方のテーブルが同期していることを確認できます。

Javaを使用しない場合は、元のテーブルの更新時に元のデータベース(電子メールがネストされたフィールド)のDynamoDB streamを読み込み、新しいテーブル(電子メールがパーティションキー)を更新できます。