【问题标题】:Query works at the console but not in code查询在控制台中有效,但在代码中无效
【发布时间】:2019-07-02 07:33:28
【问题描述】:

我的 DynamoDB 表 alexas 有这个带有键“abc”的项目,如下面的 DynamoDB 控制台所示:

但是,以下查询没有返回结果:

const params = { TableName: "alexas",
  KeyConditionExpression: "deviceId = :deviceId",
  ExpressionAttributeValues: { ":deviceId": "abc"}
}
const docClient = new AWS.DynamoDB.DocumentClient();
docClient.query(params, (err, data) => {
  if (err) {
    console.error(err);
  } else {
    console.log(data);
  }
});

上面的代码为errdata返回null

{ Items: [], Count: 0, ScannedCount: 0 }

我是 DynamoDB 表达式样式的新手。我从here 获取的代码有什么问题吗?

如果我使用scan 方法而不是query,并且在params 中只有TableName,我会在我的表中获得项目。这确认我正在对包含数据的正确表执行操作。

【问题讨论】:

    标签: amazon-dynamodb dynamodb-queries


    【解决方案1】:

    查询没有返回数据,因为键值不匹配。

    项目的deviceId 是字符串"abc" 而不是abc。注意多余的引号。

    该项目是使用 DynamoDB 控制台的创建编辑器插入的,如果该值已预期为字符串类型,则无需包含 ""

    【讨论】:

      【解决方案2】:

      DynamoDB 的 Scan 操作不采用 KeyConditionExpression - 只有 Query 操作采用此参数。 Scan 始终扫描整个表,并有一个FilterExpression 对这些结果进行后过滤(但请注意,您仍然需要为扫描整个表付费)。

      例如这里是Scan的官方文档:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

      【讨论】:

      • 你是对的。我已经把GUI改成Query了,还是一样,deviceId="abc"有一行结果。
      【解决方案3】:

      查看QueryAPI

      const params = { TableName: "alexas",
        KeyConditionExpression: "deviceId = :deviceId",
        ExpressionAttributeValues: {
           ":devideId":{
             S: "abc", // here
           }
        }
      }
      const docClient = new AWS.DynamoDB.DocumentClient();
      docClient.query(params, (err, data) => {
        if (err) {
          console.error(err);
        } else {
          console.log(data);
        }
      });
      

      ExpressionAttributeValues 需要以不同的方式传递。

      更新: 尝试使用 Exp 属性名称,(我不确定这是否会有所不同)

      var params = {
           TableName: "alexas",
           KeyConditionExpression: "#d = :dId",
           ExpressionAttributeNames:{
                "#d": "email"
           },
           ExpressionAttributeValues: {
                 ":dId": "abc"
           }
      };
      

      【讨论】:

      • 用你的方法,我得到One or more parameter values were invalid: Condition parameter type does not match schema type。我的分区键是字符串类型。
      • 能否查看创建表脚本或查看设备字段的数据类型?
      • 表格详情说Primary partition key: deviceId (String)
      • 好的。尝试在查询中使用 exp 属性名称(用它更新 ans)。如果您有 dynamodb 本地设置,我建议您在其上调试查询。
      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 2012-07-27
      • 2014-12-06
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2018-09-13
      相关资源
      最近更新 更多