【问题标题】:DynamoDB Scan FilterExpression returning empty resultDynamoDB Scan FilterExpression 返回空结果
【发布时间】:2018-04-02 13:04:05
【问题描述】:

我正在尝试使用 nodejs aws sdk 过滤 dynamodb 扫描操作返回的数据,但返回的数据有 0 个项目。

Response : {"Items":[],"Count":0,"ScannedCount":15}

我已经尝试过 FilterExpression 和 ScanFilter 但得到了相同的结果。

过滤器表达式:

var params = {
            TableName: tableName,
            FilterExpression: 'active = :active',
            ExpressionAttributeValues: {
                ':active': {
                    S: '1'
                }
            }
        };

扫描过滤器:

var params = {
            TableName: tableName,
            ScanFilter: {
                'active': {
                    "AttributeValueList": [{ "S": "1" }],
                    "ComparisonOperator": "EQ"
                }
            }
        };

这里是nodejs代码:

        dynamodb.scan(params, onScan);

        function onScan(err, data) {
            if (err) {
                console.error('Unable to scan the table. Error JSON:', JSON.stringify(err, null, 2));
            } else {
                if (typeof data.LastEvaluatedKey != 'undefined') {
                    params.ExclusiveStartKey = data.LastEvaluatedKey;
                    dynamodb.scan(params, onScan);
                }
                if (data && data.Items)
                    callback(data.Items);
                else
                    callback(null);
            }
        }

我在 dynamodb 控制台中检查了相同的过滤条件并得到了预期的结果。

dynamodb console screenshot

【问题讨论】:

  • 您的代码是否进入LastEvaluatedKey != 'undefined' 条件?换句话说,您是否正在处理不止一个电话dynamodb.scan()callback() 函数的代码是什么?这不是在 Lambda 函数中运行的吗?
  • @MarkB 不,代码不处理对 dynamodb.scan() 的多次调用,并且回调是在 EC2 实例上运行的节点快速应用程序。
  • 你可以在FilterExpressions中试试ExpressionAttributeValues : {':active': '1'}

标签: node.js amazon-web-services amazon-dynamodb


【解决方案1】:

@bharathp 回答对我有用,

在 aws 命令行中必须将参数指定为 {"S":"s1"}

aws dynamodb scan \
 --table-name aws-nodejs-typescript-dev \
 --filter-expression "id = :search" \
 --expression-attribute-values '{":search":{"S":"s1"}}'

在节点代码中只是 ":search": "s1"

const params = {
  TableName: process.env.DYNAMODB_TABLE,
  ExpressionAttributeValues: {
    ":search": "s1"
  },
  FilterExpression: "id = :search",
  ProjectionExpression: "id",
};

dynamoDb.scan(params, (error, result) => {

【讨论】:

  • 字面意思是在这几个小时,感谢您解决问题(在这种情况下,AWS 命令​​格式要求非常分散)
  • 你完全救了我。正在徘徊为什么在官方文档中找不到它?
  • 你一定是在开玩笑吧……看起来 Python 的 Boto3 SDK 也有同样的情况。似乎official docs 包含一个错误(如果我遗漏了某事,请纠正我)。甚至该方法的示例使用也是错误的。你们刚刚救了我,天知道故障排除了多少小时。非常感谢!
【解决方案2】:

这对我来说在 AWS CLI 上工作得很好,

aws dynamodb 扫描\

 --table-name myTableName \
 --filter-expression "email = :a" \
 --expression-attribute-values '{":a":{"S":"xxxxx@xxxxx.com"}}'

但是,当尝试在 NodeJs/Angular5/typescript 上编写相同的查询时,它会失败:

private getDynamoEmail(email: string): Promise<ScanOutput> {
    const params: any = {
     TableName: this.config.database.myTableHere,
     KeyConditionExpression "email = :e" 
     ExpressionAttributeValues: {
      ":email": {
        S: email, // Had to remove this part to work and use 
                  // ExpressionAttributeNames instead
       },
     },
     FilterExpression: ":e = :email",
    };
    return this.docClient.scan(params).promise();
}

为了工作,我不得不省略属性类型,所以这里是代码工作:

private getDynamoEmail(email: string): Promise<ScanOutput> {
    // tslint:disable-next-line:no-any
    const params: any = {
     ExpressionAttributeNames: {"#email": "email"},
     ExpressionAttributeValues: {":email": email},
     FilterExpression: "#email = :email",
     TableName: this.config.database.registeredLiveAccounts,
    };
    return this.docClient.scan(params).promise();
}

希望有所帮助 丹尼尔

【讨论】:

    【解决方案3】:

    表示扫描了 15 个项目,没有找到项目。您可能会在以下循环中找到该项目:

    if (typeof data.LastEvaluatedKey != 'undefined') {
      params.ExclusiveStartKey = data.LastEvaluatedKey;
      dynamodb.scan(params, onScan);
    }
    

    由于扫描操作会扫描所有项目并过滤匹配项。

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 2015-05-05
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多