在DynamoDB中使用主ID数组查询多个数据

Ind*_*dra 4 amazon-dynamodb aws-sdk

我正在使用DynamoDB作为数据库的应用程序。我有一个类似的用户表:

{
   id: 1, (Primary Key)
   name: "Indranil"
}
Run Code Online (Sandbox Code Playgroud)

现在我的要求是,我有一个数组,其id为:[1,5,8],并且我想使用单个查询加载所有用户。

现在,我在查询中将id用作keyConditionExpreassion,可以一次又一次地获取每个用户数据,但随后将导致多个查询。

    let readparams  = {
      TableName : "user",
      KeyConditionExpression: "# = :",
      ExpressionAttributeNames:{
        "#": "id"
      },
      ExpressionAttributeValues: {
        ":id":1
      }
    };
Run Code Online (Sandbox Code Playgroud)

然后我看到表达式中有一个'IN'操作,但是不能在KeyConditionExpression中使用,它可以在FilterExpreassion中使用,但是在filterExpression中我不能使用主键。而且,我不能仅在查询中传递过滤器表达式,我也必须传递键表达式,但就我而言,我没有任何其他条件要检查。

    let readparams  = {
      TableName : "user",
      FilterExpression: "id IN (:id1, :id2)",
      ExpressionAttributeValues: {
        ":id1":1,
        ":id2":1
      }
    };
Run Code Online (Sandbox Code Playgroud)

所以最终我只剩下了唯一的选择,将所有数据加载到前端,然后在前端使用id过滤那些数据,但是显然这根本不是一个好的解决方案。

有人可以指出什么是最好的解决方案。

not*_*est 7

批量获取项目 API可用于通过关键属性获取多个项目。如果为表定义了排序键,则需要提供分区和排序键属性值。

批量获取商品

一些示例代码:

var table = "phone";

var params = {
    "RequestItems" : {
        "phone" : {
            "Keys" : [ {
                "phone_num" : "+14085551212",
                "Country" : "USA"
            },
            {
                "phone_num" : "+14085551313",
                "Country" : "USA"
            }
             ]
        }
    }

};

docClient.batchGet(params, function(err, data) {
    if (err) {
        console.error("Unable to read item. Error JSON:", JSON.stringify(err,
                null, 2));
    } else {
        console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
    }
});
Run Code Online (Sandbox Code Playgroud)