"IN" dynamodb 中的语句
"IN" statement in dynamodb
我有一个 "Users" table,这是一个示例:
{
username:"haddox",
formattedPhoneNumber:"676767676",
verified: 0,
}
我希望检索其格式化电话号码包含在 phone 号码数组(从我的联系人中检索)中的所有用户。我创建了一个二级索引,验证为 HASH 和 formattedPhoneNumber 作为 RANGE。这是我的尝试:
var params = {
TableName: "Users",
IndexName: "FormattedPhoneSecondaryIndex",
KeyConditionExpression: "verified = :v AND formattedPhone IN :n",
ExpressionAttributeValues: {
":v":1,
":n": ["672053916", "642117296"]
},
ProjectionExpression: "username, formattedPhoneNumber"
};
dynamodb.query(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
但我收到以下错误:Invalid KeyConditionExpression: Syntax error; token: \":n\", near: \"IN :n\"",
IN关键字有问题吗?
也许还有另一种方法可以实现这一目标?
KeyConditionExpression 不能使用 "IN" 运算符(请参阅 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults)。在查询操作中使用 KeyConditions/KeyConditionExpression 的想法是更有效地从 DynamoDB 中读取项目页面,因为具有相同哈希键但不同范围键的项目是连续存储的,并且是按排序顺序存储的。 IN 运算符需要提取某些页面的一小部分,这会降低 Query 操作的效率,因此在 KeyConditions 中是不允许的。您可能希望将其添加为 FilterExpression,这是一个方便的参数,可以减少从 DynamoDB 返回的项目数量,但不会影响从 DynamoDB 读取数据的方式。
我们就是这样解决的。
-(AWSDynamoDBScanExpression *) prepareScanExpressionWithName:(NSString*)name andValues:(NSArray *)vals {
AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];
NSMutableString* filterExpression = [NSMutableString string];
NSMutableDictionary* expression = [NSMutableDictionary dictionary];
for(int i = 0; i < vals.count; i++)
NSString *val = vals[i];
NSString* key = [NSString stringWithFormat:@":val%i",i];
[filterExpression appendString:key];
[expression setObject:val forKey:key];
if (i < vals.count) {
[filterExpression appendString:@","];
}
}
scanExpression.filterExpression = [NSString stringWithFormat:@"#P IN (%@)", filterExpression];
scanExpression.expressionAttributeNames = @{@"#P": name};
scanExpression.expressionAttributeValues = expression;
return scanExpression;
}
我有一个 "Users" table,这是一个示例:
{
username:"haddox",
formattedPhoneNumber:"676767676",
verified: 0,
}
我希望检索其格式化电话号码包含在 phone 号码数组(从我的联系人中检索)中的所有用户。我创建了一个二级索引,验证为 HASH 和 formattedPhoneNumber 作为 RANGE。这是我的尝试:
var params = {
TableName: "Users",
IndexName: "FormattedPhoneSecondaryIndex",
KeyConditionExpression: "verified = :v AND formattedPhone IN :n",
ExpressionAttributeValues: {
":v":1,
":n": ["672053916", "642117296"]
},
ProjectionExpression: "username, formattedPhoneNumber"
};
dynamodb.query(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
但我收到以下错误:Invalid KeyConditionExpression: Syntax error; token: \":n\", near: \"IN :n\"",
IN关键字有问题吗? 也许还有另一种方法可以实现这一目标?
KeyConditionExpression 不能使用 "IN" 运算符(请参阅 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults)。在查询操作中使用 KeyConditions/KeyConditionExpression 的想法是更有效地从 DynamoDB 中读取项目页面,因为具有相同哈希键但不同范围键的项目是连续存储的,并且是按排序顺序存储的。 IN 运算符需要提取某些页面的一小部分,这会降低 Query 操作的效率,因此在 KeyConditions 中是不允许的。您可能希望将其添加为 FilterExpression,这是一个方便的参数,可以减少从 DynamoDB 返回的项目数量,但不会影响从 DynamoDB 读取数据的方式。
我们就是这样解决的。
-(AWSDynamoDBScanExpression *) prepareScanExpressionWithName:(NSString*)name andValues:(NSArray *)vals {
AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];
NSMutableString* filterExpression = [NSMutableString string];
NSMutableDictionary* expression = [NSMutableDictionary dictionary];
for(int i = 0; i < vals.count; i++)
NSString *val = vals[i];
NSString* key = [NSString stringWithFormat:@":val%i",i];
[filterExpression appendString:key];
[expression setObject:val forKey:key];
if (i < vals.count) {
[filterExpression appendString:@","];
}
}
scanExpression.filterExpression = [NSString stringWithFormat:@"#P IN (%@)", filterExpression];
scanExpression.expressionAttributeNames = @{@"#P": name};
scanExpression.expressionAttributeValues = expression;
return scanExpression;
}