【问题标题】:DynamoDB Query with sort key and partition key带有排序键和分区键的 DynamoDB 查询
【发布时间】:2020-12-24 13:47:30
【问题描述】:

我正在使用带有 DynamoDB 的 JS SDK 来获取数据。

我可以使用partition keysort key 的简单查询从我的表中获取数据。

我的排序键 sk 有记录 -

Year#Batch#Rate

如果我通过var sk = "2006#CSE#90";,它会返回所有匹配的记录,

要求-我怎样才能得到所有带有year 2006Batch CSERate =>90的产品

readItem_pbro(){
  console.log("inside pbro");
  var table2 = "pbro";
  var pk = "1";
  var sk = "2006#CSE#90";

  var params2 = {
      TableName: table2,
      Key:{
          "pk": pk,
          "sk": sk
      }
  };

编辑 1 :: 为分数/评分创建了一个不同的列作为分数。它是数字。

现在我在JS 中的查询是 - 但我收到错误 - ValidationException: The provided key element does not match the schema

readItem_score_filter(){
  console.log("inside pbro");
  var table2 = "pbro"; 
  var pk = "1";  // string
  var sk = "2006#CSE"; // string
  var score = 90; //number

  var params2 = {
      TableName: table2,
      Key:{
          "pk": pk,
          "sk": sk,
          FilterExpression:'score >=:score',
      }
  };

我的FilterExpression 出了什么问题。

编辑 2 :: 添加了关键条件表达式,但问题仍然存在

错误:ValidationException: The provided key element does not match the schema 这是我现在的完整功能:

readItem_score_filter(){
  console.log("inside pbro");
  var table2 = "pbro";
  var pk = "1"; //string
  var sk = "2006#CSE"; // string
  var score = 90; //number

  var params2 = {
      TableName: table2,
      Key:{
          "pk": pk,
          "sk": sk,
          "score": score,
           KeyConditionExpression: 'pk = :pk AND sk=:sk',
           FilterExpression: "score >=:score",
      }
  };
  this.user.docClient.get(params2, function(err, data) {
    if (err) {
      console.log(err);
    } else {
      console.log(data);
    }
});
}

附上表格的屏幕截图,以防您需要查看::

【问题讨论】:

  • "2006#CSE#90" - 这个值是一个属性(列)还是三个属性?
  • 这是排序键,一列
  • year、batch 和 rate 是不同的列还是只有一列?
  • 一栏全部

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

如果“2006#CSE#90”这是排序键列的值,那么您无法在 Dynamodb 级别执行任何操作..

可以通过正则表达式进行此类比较,但 DynamoDB 不支持正则表达式。

您只需要获取结果,然后将这些值分开并进行比较..

更新:- 使用不同的列作为分数。

并使用Filter Expression 获取比率超过 90 的记录。

我不知道python,但还是在这里尝试

var params2 = {
TableName: "pbro",
KeyConditionExpression: "pk = :pk AND sk =:sk", 
FilterExpression: "score >= :score" 

};

【讨论】:

  • 学院 ID 是分区键,Batch#Course 是排序键,现在我在哪里放置分数:(
  • 在 score/rate 列上使用过滤器表达式
  • 好的,我已经将列分开了,命名为 score ,你能用我的代码更新你的答案吗
  • 请注意既不是分区也不是排序键中的分数列
  • 我的问题已经编辑了1,你可以看看
猜你喜欢
  • 1970-01-01
  • 2017-07-18
  • 2019-05-19
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多