2017-07-13 1 views
1

のフィルタマップ:DynamoDBの - 私はこのようになりますDynamoDBのでコレクションをスキャンし、フィルタリングするnodejsを使用していますスキャンし、nodejs

{ 
    "name": "teste123", 
    "id": "4bbe0f00-67c3-11e7-a6be-b9c9fc540ac2", 
    "clustermembers": [ 
     { 
      "email": "[email protected]", 
      "role": "ADMIN", 
      "id": "4bbe0f00-67c3-11e7-a6be-b9c9fc540ac2" 
     } 
    ] 
} 

次のコードPICEで:

var params = { 
    TableName : "mytable", 
    FilterExpression : "clustermembers.email = :p_email", 
    ExpressionAttributeValues : { 
     ":p_email": {"S": req.params.usr_email} 
    } 
}; 

var promiseQuery = client.scan(params).promise(); 

promiseQuery 
    .then(function(data) { 
     res.send({clusters: data.Items}); 
    }) 
    .catch(function(err) { 
     console.log('ERROR - get all clusters by user = ' + err); 
     res.status(500).send('ERROR - get all clusters by user = ' + err); 
    }); 

それは1つのレコードを返すはずですが、結果は得られません。ここで私は何が欠けているのですか?

ありがとうございました!

答えて

2

リストのデータ型から値を取得するには、配列インデックスをインクルードする必要があります。それ以外の場合は、コンテナ番号を使用する必要があります。ただし、CONTAINS関数では、オブジェクト内のすべての属性が項目をマップする必要があります。あなたのシナリオでは、あなたはを含む電子メール、IDとロールを知っている必要があります機能を含む。

注: - あなたが複数のクラスタ・メンバを持っていて、アレイ内の他の出現に存在するメンバーにマッチしたい場合

以下のソリューションは、動作しないでしょう。これを実現するには、コンテナ番号を使用する必要があります。これは、オブジェクト内の3つの属性をすべて提供することによって行われます。

var params = { 
    TableName: "mytable", 
    FilterExpression: "clustermembers[0].email = :emailVal", 
    ExpressionAttributeValues: { 
     ":emailVal": '[email protected]' 
    } 
}; 
+0

こんにちはnotionquest。まず、助けてくれてありがとう。このアプローチは機能しますが、このシナリオではすべての情報がありません。私はログインしたユーザーがその "クラスタ"へのアクセス権を持っているかどうかを確認しています。複数の "クラスタメンバー"があります。サブコレクション内の特定のメールを探す方法がないので、このデータを別のデータに移動する方が良いと思います。再度、助けをありがとう。 – Marrone

関連する問題