web-dev-qa-db-ja.com

nodejsでFilterExpressionを使用したDynamoDBスキャン

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}
13
Mike Partridge

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値に移動したことに注意してください。特定のフィールド名を使用しないとリクエストが壊れる可能性があるため、これは良い習慣です。

11
Joe Lafiosca