繁体   English   中英

DynamoDB Scan FilterExpression 返回空结果

[英]DynamoDB Scan FilterExpression returning empty result

我正在尝试使用 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 控制台截图

@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 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();
}

希望能帮助丹尼尔

它表示扫描了 15 个项目,但未找到任何项目。 您可能会在以下循环中找到该项目:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM