2016-09-19 74 views
0

INフィルタを使用してDynamoDBテーブルをクエリしようとしています。私のクエリはINに単一の値を渡すと機能しますが、複数回渡すと一致しません。INを使用してDynamoDBクエリをフィルタリングする

paramsオブジェクトの初期設定は次のとおりです。

var params = { 
    TableName: "Interactions", 
    IndexName: "environment-time-index", 
    KeyConditionExpression: "#environment = :environment and #time between :start and :end", 
    FilterExpression: "#product = :product", 
    ExpressionAttributeNames: { 
     "#product": "product", 
     "#environment": "environment", 
     "#time": "time" 
    }, 
    ExpressionAttributeValues: { 
     ":product": product,  
     ":environment": environment, 
     ":start": start, 
     ":end": end 
    } 
    }; 

次に、ユーザーが確定クエリパラメータを指定した場合、私はparamsオブジェクトを変更します。ここでは、IN演算子を使用します。

if (req.query.firm) { 
    var firms = req.query.firm; 
    console.log('debug', firms); 
    params.FilterExpression += " AND #firmCode IN (:firms)"; 
    params.ExpressionAttributeNames["#firmCode"] = "firmCode"; 
    params.ExpressionAttributeValues[":firms"] = firms; 
    } 

最後に、このようにクエリを実行します。

docClient.query(params, function(err, data) { 
    if (err) { 
     log.error(`Unable to scan. Error: ${JSON.stringify(err, null, 2)}`); 
     res.status(500).json({ error: "Oh, snap!" }); 
    } else { 
     data.Parameters = params.ExpressionAttributeValues; 
     log.info(`Scan succeeded. Received ${data.Count} items.`) 
     res.send(data); 
    } 
    }); 

firmパラメータに単一の値が含まれていると、結果が返されます。

Level="INFO", Date="2016-09-19 14:26:03,373", Message="batchinsight received GET for /api/history/interactions2", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 
debug TW7ZN 
Level="INFO", Date="2016-09-19 14:26:03,623", Message="Scan succeeded. Received 19 items.", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 

しかし、複数の値が含まれている場合、結果は返されません。

Level="INFO", Date="2016-09-19 14:35:16,896", Message="batchinsight received GET for /api/history/interactions2", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 
debug TW7ZN,TEXK4 
Level="INFO", Date="2016-09-19 14:35:16,991", Message="Scan succeeded. Received 0 items.", Product="Exhaust", Service="batchinsight", AppDomain="Exhaust_batchinsight" 

DynamoDBのドキュメントでは、IN演算子がコンマ区切りの値リストを受け入れることができますが、動作させることはできません。助けてください! http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html#ConditionExpressionReference

答えて

1

実際には、FilterExpressionとは異なるConditionExpressionリファレンスドキュメントを参照しています。

条件式は、読んだり(クエリ/スキャンと混同しないようにしてください)、テーブルに項目を書き込む際の制約を表しています。

実際にテーブルを照会しています。 FilterExpressionは、データのクエリとスキャンに使用されます。

IN:2組の一致する要素をチェックします。 AttributeValueList には、タイプString、 番号、またはバイナリ(セットタイプではない)の1つ以上のAttributeValueエレメントが含まれます。これらの属性は、項目の既存のセットタイプ属性に対して と比較されます。入力セットが のいずれかの要素がアイテム属性に存在する場合、式 はtrueと評価されます。

INは、SETデータ型に存在する単一の値が存在するかどうかをチェックするために使用されます。

類似のポストhereを参照することができます。ここでは、OR条件を使用してSETデータ型の複数の値を比較します。

同様に、firmCodeがSTRINGまたはSETデータ型の場合は、OR条件を使用する必要があります。

関連する問題