DynamoDB Javascript – 通过主键和范围键数组查询?

DynamoDB新手,需要执行上述查询,但不知道如何。 这是我目前正在尝试,我得到下面的错误。

顺便说一句,我使用这个JavaScript库瓦特/ DynamoDB: https : //github.com/awslabs/dynamodb-document-js-sdk

var ids = ['12313','12312313','12312313']; var params = { TableName: 'apps', IndexName: 'state-app_id-index', KeyConditions: [ DynamoDB.Condition("state", "EQ", "active"), DynamoDB.Condition("id", "IN", ids) ] }; DynamoDB.query(params, function(error, response) {}); 

我得到的错误如下所示:

ValidationException:一个或多个参数值无效:ComparisonOperator IN对于L AttributeValuetypes无效

KeyConditions不支持IN运算符。 KeyCondition的文档说明了它支持的操作符:

对于KeyConditions,仅支持以下比较运算符:

EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN

EQ运算符也只能用于单个值:

  • EQ :相等。

    AttributeValueList只能包含一个types为String,Number或Binary的AttributeValue (不是一个集合types)。 如果一个项目包含与请求中指定的types不同的AttributeValue元素,则该值不匹配。 例如, {"S":"6"}不等于{"N":"6"} 。 另外, {"N":"6"}不等于{"NS":["6", "2", "1"]}

KeyConditionExpression的限制基本相同,这是对键进行过滤的更新推荐方法。 这里是文档(重点是我的)的一个片段:

条件必须对单个散列键值执行相等性testing。 该条件还可以执行单个范围键值的几个比较testing之一查询可以使用KeyConditionExpression检索具有给定散列和范围键值的一个项目,或者具有相同散列键值但不同范围键值的多个项目

在你的情况下,你可以用类似于这个答案中所描述的方式构buildFilterExpression

使用IN语句的唯一方法是使用过滤条件。 但是Filterexpression式只能包含非主键属性。 因此,您想要实现的查询不可能与主键。 像这样的东西

 var params = { TableName: 'apps', ... FilterExpression: "#id IN (:one,:two)",: ... 

只有非主键属性才可能

您可以应用的解决方法是使用批量获取项目因此,而不是在一个调用中发出一个查询问题倍数,并且每个条件应包含您的ID数组中的值。

说到批量获取项目,请注意读取容量单位( 在node.js中批量获取项目 )。