"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;
}