[英]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 控制台中检查了相同的过滤条件并得到了预期的结果。
@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.