FilterExpression
に一致するDynamoDBテーブルからすべてのアイテムを取得しようとしています。すべてのアイテムがスキャンされ、半分は一致しますが、予期されたアイテムが返されません。
Node.js 6.10で実行されているAWS Lambda関数に以下があります。
var AWS = require("aws-sdk"),
documentClient = new AWS.DynamoDB.DocumentClient();
function fetchQuotes(category) {
let params = {
"TableName": "quotient-quotes",
"FilterExpression": "category = :cat",
"ExpressionAttributeValues": {":cat": {"S": category}}
};
console.log(`params=${JSON.stringify(params)}`);
documentClient.scan(params, function(err, data) {
if (err) {
console.error(JSON.stringify(err));
} else {
console.log(JSON.stringify(data));
}
});
}
テーブルには10の項目があり、そのうちの1つは次のとおりです。
{
"category": "ChuckNorris",
"quote": "Chuck Norris does not sleep. He waits.",
"uuid": "844a0af7-71e9-41b0-9ca7-d090bb71fdb8"
}
カテゴリ「ChuckNorris」でテストすると、ログに次のように表示されます。
params={"TableName":"quotient-quotes","FilterExpression":"category = :cat","ExpressionAttributeValues":{":cat":{"S":"ChuckNorris"}}}
{"Items":[],"Count":0,"ScannedCount":10}
scan
を呼び出すと、TableName
のみを指定すると、10項目すべてが返されます。
params={"TableName":"quotient-quotes"}
{"Items":[<snip>,{"category":"ChuckNorris","uuid":"844a0af7-71e9-41b0-9ca7-d090bb71fdb8","CamelCase":"thevalue","quote":"Chuck Norris does not sleep. He waits."},<snip>],"Count":10,"ScannedCount":10}
DynamoDB DocumentClientを使用しているため、ExpressionAttributeValues
でタイプ(_"S"
_)を指定する必要はありません。 ドキュメント :
ドキュメントクライアントは、属性値の概念を抽象化することで、Amazon DynamoDBのアイテムの操作を簡素化します。この抽象化は、入力パラメーターとして提供されるネイティブJavaScript型に注釈を付けるとともに、注釈付き応答データをネイティブJavaScript型に変換します。
new AWS.DynamoDB()
を介して未加工のDynamoDBオブジェクトを使用している場合にのみ、属性タイプ(つまり、_"S"
_、_"N"
_などのキーを持つ単純なオブジェクト)を指定する必要があります)。
DocumentClient
を使用すると、次のようなパラメーターを使用できるはずです。
_const params = {
TableName: 'quotient-quotes',
FilterExpression: '#cat = :cat',
ExpressionAttributeNames: {
'#cat': 'category',
},
ExpressionAttributeValues: {
':cat': category,
},
};
_
一貫性と安全性のために、フィールド名もExpressionAttributeNames
値に移動したことに注意してください。特定のフィールド名を使用しないとリクエストが壊れる可能性があるため、これは良い習慣です。