查询可以在控制台上运行,但不能在代码中运行

时间:2019-07-02 07:33:28

标签: amazon-dynamodb dynamodb-queries

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

enter image description here

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

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);
  }
});

以上代码为nullerr返回了data

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

我是DynamoDB表达式风格的新手。我从here取得的代码有什么问题。

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

3 个答案:

答案 0 :(得分:3)

由于键值不匹配,查询没有返回任何数据。

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

该项目是使用DynamoDB控制台的“创建”编辑器插入的,并且如果已经期望该值属于字符串类型,则无需包括""

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

选中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"
     }
};