通过GSI

时间:2017-11-21 16:29:11

标签: node.js amazon-dynamodb

我想通过node.js更新AWS DynamoDB中的现有项目。我只有我想要更新的项目的二级索引值。我无法访问主索引...

Id: primary index
CallId: global secondary index
CallStatus: normal field

我想通过使用CallId(不使用密钥)来更新CallStatus。

我尝试了不同的方法,如:

  • 扫描项目,然后使用提取的主键进行更新
  • 通过GSI查询然后更新
  • 条件更新

但这些方法都不适合我。我假设,因为我没有正确使用它们。任何帮助表示赞赏: - )。

“扫描和更新”方法的代码示例:

  var docClient = new aws.DynamoDB.DocumentClient();
  var params = {
    TableName: 'myTable',
    FilterExpression: 'CallId = :c',
    ExpressionAttributeValues: {
      ':c': callSid
    }
  };

  docClient.scan(params, function (err, result) {
    if (err) {
      console.error("Unable to query item. Error JSON:", JSON.stringify(err));
    } else {
      console.log(result);

      // Update call status
      var params = {
        TableName: "myTable",
        Key: {
          "Id": result.Items[0].Id
        },
        UpdateExpression: "set CallStatus = :s",
        ExpressionAttributeValues: {
          ":s": callStatus
        },
        ReturnValues: "UPDATED_NEW"
      };

      docClient.update(params, function (err, data) {
        if (err) {
          console.error("Unable to update item. Error JSON:", JSON.stringify(err));
        } else {
          console.log("Update item succeeded:", JSON.stringify(data));
        }
      });
    }
  });

1 个答案:

答案 0 :(得分:1)

好的,我发现了我的错误。上述更新后的调用应该关闭AWS Lambda会话,因此DynamoDB的异步更新永远不会发生......

现在正在运行的代码如下:

  var params = {
    TableName: 'table',
    IndexName: 'CallId-index',
    KeyConditionExpression: 'CallId = :id',
    ExpressionAttributeValues: {
      ':id': callSid
    }
  };

  docClient.query(params, function (err, result) {
    if (err) {
      console.log("Unable to query item. Error JSON:", JSON.stringify(err));
    } else {
      var params = {
        TableName: "table",
        Key: {
          "Id": result.Items[0].Id
        },
        UpdateExpression: "set CallStatus = :s",
        ExpressionAttributeValues: {
          ":s": callStatus
        },
        ReturnValues: "UPDATED_NEW"
      };
      docClient.update(params, function (err, data) {
        if (err) {
          console.log("Unable to update item. Error JSON:", JSON.stringify(err));
        } else {
          // do sth. else
        }
      });
    }
  });