【问题标题】:How to get data from aws Dynamodb with using partition key only?如何仅使用分区键从 aws Dynamodb 获取数据?
【发布时间】:2022-05-11 01:57:29
【问题描述】:

我正在使用 aws-sdk-go 库在 Golang 中进行 DynamoDb 连接。

我的 DynamoDb 表有一个分区键 DeviceId(字符串)和一个排序键时间(数字)。如何编写 GetItemInput 以获取具有特定 DeviceId 的所有数据?

params := &dynamodb.GetItemInput{

    Key:    map[string]*dynamodb.AttributeValue {
        "DeviceId": {
            S: aws.String("item_1"),
        },
    },
    ExpressionAttributeNames: map[string]*string{
        "DeviceId": "DeviceId",
    },
    TableName:  aws.String("DbName"), 
}

list, err := svc.GetItem(params)

【问题讨论】:

    标签: amazon-web-services go amazon-dynamodb aws-sdk aws-sdk-go


    【解决方案1】:

    您必须使用查询或扫描操作,这是一个简单的示例,但您可以在亚马逊文档here 上阅读更多信息

    特别是查询操作

    查询操作仅使用主键属性值在表或二级索引中查找项目

    var queryInput = &dynamodb.QueryInput{
        TableName: aws.String(dynamoRestDataTableName),
        KeyConditions: map[string]*dynamodb.Condition{
            "DeviceId": {
                ComparisonOperator: aws.String("EQ"),
                AttributeValueList: []*dynamodb.AttributeValue{
                    {
                        S: aws.String("aDeviceId"),
                    },
                },
            },
        },
    }
    
    var resp, err = dynamoSvc.Query(queryInput)
    if err != nil {
        return nil, err
    }
    

    【讨论】:

    • 谢谢兄弟。您能告诉我如何从 QueryOutput 访问数据吗?假设如果我想访问查询输出中的最后一个条目,我该怎么做?
    • 这是唯一的方法吗? *resp.Items[*resp.Count - int64(1)]["attribute"].S
    • 这看起来很完美 Alessio 除了它应该是S: aws.String("aDeviceId"),
    • @user6681013 如果我们查看api.go,我们可以看到QueryOutput 结构具有Items []map[string]*AttributeValue 的定义,因此结果以映射数组的形式返回。每个映射代表一行值,映射中的每个键代表表中的一个列名。
    【解决方案2】:

    这种情况下可以使用查询操作
    以下是相同的一个通用示例

    compositeKey := entity.GetPrimaryKey(inputVar)
    expressionAttributeValues := map[string]*dynamodb.AttributeValue{
        ":v1": {
            S: aws.String(compositeKey.PartitionKey.Data.(string)),
        },
    }
    queryInput := dynamodb.QueryInput{
        TableName:                 &d.TableName,
        KeyConditionExpression:    aws.String("id = :v1"),
        ExpressionAttributeValues: expressionAttributeValues,
    }
    queryOutput, err := d.DdbSession.Query(&queryInput)
    if err != nil {
        log.Error("error in fetching records ", err)
        return nil, err
    }
    
    // unmarshal the query output - items to interface
    
    err = dynamodbattribute.UnmarshalListOfMaps(queryOutput.Items, &yourInterface)
    

    【讨论】:

      【解决方案3】:

      您可以像这样在 JavaScript SDK v2 中使用 getItem

      const params = {
          TableName: 'tableName',
          Key: {
              id: { S: id },
          },
      };
      
      const result = await dynamoDb.getItem(params).promise();
      if (result.Item === undefined) {
          throw new Error('not found');
      }
      const item = AWS.DynamoDB.Converter.unmarshall(result.Item)
      

      如果 JavaScript SDK 可以做到这一点,我假设 golang SDK 也可以。如果不是,这意味着 AWS 不会平等对待所有语言?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 2022-11-20
        相关资源
        最近更新 更多