在nodejs中使用FilterExpression进行DynamoDB扫描

Mik*_*dge 9 node.js amazon-dynamodb aws-lambda

我正在尝试从DynamoDB表中检索匹配a的所有项目FilterExpression,虽然扫描了所有项目并且一半匹配,但不会返回预期的项目.

我在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));
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

表中有10个项目,其中一个是:

{
  "category": "ChuckNorris",
  "quote": "Chuck Norris does not sleep. He waits.",
  "uuid": "844a0af7-71e9-41b0-9ca7-d090bb71fdb8"
}
Run Code Online (Sandbox Code Playgroud)

使用"ChuckNorris"类别进行测试时,日志显示:

params={"TableName":"quotient-quotes","FilterExpression":"category = :cat","ExpressionAttributeValues":{":cat":{"S":"ChuckNorris"}}}
{"Items":[],"Count":0,"ScannedCount":10}
Run Code Online (Sandbox Code Playgroud)

scan当我只指定时,该调用返回所有10个项目TableName:

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}
Run Code Online (Sandbox Code Playgroud)

Joe*_*sca 14

您不需要"S"在您中指定type(),ExpressionAttributeValues因为您正在使用DynamoDB DocumentClient.根据文件:

文档客户端通过抽象出属性值的概念简化了在Amazon DynamoDB中处理项目的过程.此抽象注释作为输入参数提供的本机JavaScript类型,以及将带注释的响应数据转换为本机JavaScript类型.

只有当您通过使用原始DynamoDB对象new AWS.DynamoDB(),你需要指定属性类型(例如,简单对象键上"S","N"等).

有了DocumentClient,你应该能够使用这样的参数:

const params = {
    TableName: 'quotient-quotes',
    FilterExpression: '#cat = :cat',
    ExpressionAttributeNames: {
        '#cat': 'category',
    },
    ExpressionAttributeValues: {
        ':cat': category,
    },
};
Run Code Online (Sandbox Code Playgroud)

请注意,ExpressionAttributeNames为了保持一致性和安全性,我还将字段名称移动为一个值.这是一个很好的做法,因为如果不这样做,某些字段名称可能会破坏您的请求.

  • 此外,对嵌套属性使用 ExpressionAttributeNames 的语法与预期略有不同 - 您必须将路径的每个部分定义为单独的属性名称,然后将它们与 FilterExpression 中的点组合起来(例如#pr.#1star) :https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html#Expressions.ExpressionAttributeNames.NestedAttributes (2认同)