Amazon web services &引用;在;dynamodb中的语句

Amazon web services &引用;在;dynamodb中的语句,amazon-web-services,amazon-dynamodb,aws-sdk,nosql,Amazon Web Services,Amazon Dynamodb,Aws Sdk,Nosql,我有一个“用户”表,下面是一个示例: { 用户名:“haddox”, 格式化电话号码:“676”, 已验证:0, } 我希望检索其formattedPhoneNumber包含在电话号码数组中的所有用户(从我的联系人检索)。我创建了一个二级索引,verified作为散列,formattedPhoneNumber作为范围。以下是我的尝试: var参数={ TableName:“用户”, IndexName:“FormattedPhoneSecondaryIndex”, KeyConditionEx

我有一个“用户”表,下面是一个示例:

{
用户名:“haddox”,
格式化电话号码:“676”,
已验证:0,
}
我希望检索其formattedPhoneNumber包含在电话号码数组中的所有用户(从我的联系人检索)。我创建了一个二级索引,verified作为散列,formattedPhoneNumber作为范围。以下是我的尝试:

var参数={
TableName:“用户”,
IndexName:“FormattedPhoneSecondaryIndex”,
KeyConditionExpression:“已验证=:v并在:n中格式化电话”,
表达式属性值:{
“:v”:1,
“:n”:[“672053916”,“642117296”]
},
ProjectionExpression:“用户名,格式化电话号码”
};
dynamodb.query(参数、函数(错误、数据){
如果(错误)
log(JSON.stringify(err,null,2));
其他的
log(JSON.stringify(data,null,2));
});
但是我得到了以下错误:
无效的KeyConditionExpression:Syntax error;令牌:\“:n\”,靠近:\“IN:n\”,

IN关键字有什么问题吗?
也许还有其他方法可以实现这一点?

KeyConditionExpression不能使用“IN”运算符(请参阅)。在查询操作中使用KeyConditions/KeyConditionExpression的想法是更有效地从DynamoDB读取项目页面,因为具有相同哈希键但不同范围键的项目是连续存储的,并且是按排序顺序存储的。in运算符将需要提取某些页面的小部分,这使得查询操作不那么复杂高效,因此在KeyConditions中不允许使用。您可能希望将其添加为FilterExpression,这是一个方便的参数,可以减少从DynamoDB返回的项目数,但不会影响从DynamoDB读取数据的方式。

我们就是这样解决的

-(AWSDynamoDBScanExpression*)使用名称:(NSString*)名称和值:(NSArray*)VAL准备CANExpression{
AWSDynamoDBScanExpression*scanExpression=[AWSDynamoDBScanExpression new];
NSMutableString*filterExpression=[NSMutableString];
NSMutableDictionary*表达式=[NSMutableDictionary];
对于(int i=0;i
您是否尝试了“(验证=:v)和(格式化电话输入(:n))“嗨!我刚试过,但没用。@HadrienPierreMazelier你能粘贴你的工作示例吗?好的,谢谢!这意味着它将从db中获取所有项目,然后对其进行正确的筛选?是-因此将KeyConditionExpression保持在verified=1,但在[]中为formattedPhoneNumber添加一个筛选表达式。这样,请求将只获取已验证=1的项目,然后执行筛选。
scanExpression.filterExpression=@“Id IN(:val)”;scanExpression.expressionAttributeValues=@{@:val:[idList Components通过字符串连接:@“,“]}这是怎么使用的?我尝试过放置阵列但没有成功,这就是为什么加入array@MinSoe我和你有同样的问题。如何使用像你这样的In运算符这只是在filter表达式中使用In,它仍然读取大量数据,然后在返回之前过滤结果,实际上并不能有效地只读取满足IN条件的行。hi@cryanbhu你能建议一下吗?是的,我们知道这是低效的,但这是我们唯一能够计算出时间的方法。我只是重申了最高答案的观点,即在DynamoDB中没有有效的方法来进行等效。为了优化查询效率,您必须重新考虑数据,可能需要将列表项拆分为列,然后在该列上建立索引。在决策阶段对SQL和noSQL有很好的理解会有很大帮助。