DynamoDB(Go#3 포함) - 복합 키

16895 단어 dynamodbgoaws

이 네 가지 기술을 사용하여 15분 안에 DynamoDB에서 파일 시스템을 구축합니다!


지난 회를 읽은 후, 다이나마이트는 간단한 키 값 저장소일 뿐이라고 생각할 수도 있다.DynamoDB는 이뿐만이 아니기 때문에 나는 일을 분명히 하고 싶다.지난번에 열쇠가 더 복잡할 수도 있다고 했잖아.Go#3으로 DynamoDB의 버튼 주제를 깊이 파고들 준비를 하세요!

파일 시스템 구축


완전한 파일 시스템은 아닐지 모르지만, 디렉터리에 많은 파일이 있는 트리 구조를 만들고 싶습니다.또한 두 가지 방법으로 이 파일 시스템을 조회하고 싶습니다.
  • 주어진 디렉터리에서 파일 하나 주세요
  • 디렉터리에 있는 모든 파일을 주세요.
  • 이것들은 나의 방문 모드다.나는 내가 이런 조회를 실행할 수 있도록 하는 방식으로 나의 표를 모델링하고 싶다.

    복합 키


    복합 메인 키는 섹션 키와 정렬 키로 구성되어 있다.세부 사항을 깊이 있게 토론하지 않은 상황에서 (AWS 문서는 이 주제를 상세하게 소개했다), 섹션 키와 정렬 키는 다이나믹 DB의 한 항목을 표시한다.많은 항목들이 같은 섹션 키를 가질 수 있지만, 항목마다 다른 정렬 키가 필요하다.테이블에서 항목을 찾고 파티션 키가 무엇인지 이미 알고 있는 경우 Sort Key는 특정 항목으로 검색 범위를 좁힙니다.
    만약 테이블이 섹션 키로만 정의된다면;모든 항목은 섹션 키로 유일하게 식별됩니다.단, 시계가 복합 키로 정의된 경우;모든 항목은 한 쌍의 섹션 키와 정렬 키로 식별된다.

    테이블 정의


    이 모든 이론을 감안하여 파일 시스템에서 섹션 키와 정렬 키가 무엇인지 알아봅시다.
    표의 모든 항목은 하나의 파일을 대표한다.또한 각 파일은 부모 디렉토리를 가리켜야 합니다.내가 언급한 바와 같이 정렬 키는 검색 범위를 줄일 수 있다.이 예에서, 우리는 이미 찾으려는 디렉터리를 알고 있으며, 검색 범위를 하나의 파일로 좁히기를 희망한다.
    이것은 directory가 섹션 키이고 filename가 정렬 키임을 나타낸다.구름이 틀을 이루는 것으로 표현합시다.
    Resources:
      FileSystemTable:
        Type: AWS::DynamoDB::Table
        Properties:
          AttributeDefinitions:
            - AttributeName: directory
              AttributeType: S
            - AttributeName: filename
              AttributeType: S
          KeySchema:
            - AttributeName: directory
              KeyType: HASH
            - AttributeName: filename
              KeyType: RANGE
          BillingMode: PAY_PER_REQUEST
          TableName: FileSystemTable
    
    우리는 두 개의 속성 (((directoryfilename 을 정의해야 한다. 왜냐하면 그것들은 모두 복합 키의 일부이기 때문이다.보시다시피 템플릿에 정렬 키가 없습니다.그러나 RANGE 키 유형도 있습니다.참고 사항:
  • HASH 키 유형은 파티션 키에 해당합니다.
  • RANGE 키 유형은 정렬 키에 대응
  • 코드 계속 설명


    이것이 바로 DynamoDB의 단일 항목의 외관입니다.
    type item struct {
      Directory string `dynamodbav:"directory"`
      Filename  string `dynamodbav:"filename"`
      Size      string `dynamodbav:"size"`
    }
    
    나는 우리가 내용을 조회할 수 있도록 데이터베이스에 몇 개의 항목을 삽입할 것이다.간결하게 보기 위해서, 이 동작을 실행하고 있는 코드를 생략합니다. here 을 찾을 수 있습니다.마지막으로 다음 표를 드리려고 합니다.
    번호부
    파일 이름
    크기
    돕다
    2017년 보고.pdf
    1MB
    돕다
    2018년 보고.pdf
    1MB
    돕다
    2019년 보고.pdf
    1MB
    돕다
    2020년 보고서.pdf
    2MB
    재미
    게임
    4GB

    질의 #1: 지정된 디렉토리에서 파일 하나


    데이터베이스 설정부터 시작해야 합니다.
    func TestSingleFileFromDirectory(t *testing.T) {
      ctx := context.Background()
      tableName := "FileSystemTable"
      db, cleanup := dynamo.SetupTable(t, ctx, tableName, "./template.yml")
      defer cleanup()
      insert(ctx, db, tableName)
    
    DynamoDB에 연결하고 테스트 데이터를 삽입한 후에 우리는 그 자체를 계속 조회할 수 있습니다.DynamoDB에서 원소를 얻고 싶어서 사용합니다GetItemWithContext.
    out, err := db.GetItemWithContext(ctx, &dynamodb.GetItemInput{
      Key: map[string]*dynamodb.AttributeValue{
        "directory": {S: aws.String("finances")},
        "filename":  {S: aws.String("report2020.pdf")},
      },
      TableName: aws.String(table),
    })
    
    주의, Key는 두 가지 요소로 구성되어 있다. directory(섹션 키)와 filename(정렬 키)이다.검색의 출력이 우리가 생각하는 것과 같을 수 있도록 합니다.
    var i item
    err = dynamodbattribute.UnmarshalMap(out.Item, &i)
    assert.NoError(t, err)
    assert.Equal(t, item{Directory: "finances", Filename: "report2020.pdf", Size: "2MB"}, i)
    

    질문 2: 전체 디렉터리 주세요


    이 검색에서 우리는 GetItemWithContext 을 사용할 수 없습니다. 왜냐하면 우리는 다이나마이드에서 많은 항목을 얻고 싶기 때문입니다.그 밖에 우리가 단일한 항목을 얻게 되면, 우리는 전체 복합 키를 알아야 한다.섹션 키만 알 수 있도록 디렉터리에서 모든 파일을 가져오길 희망합니다.이 문제를 해결하는 방법은 QueryWithContext 방법과 관건적인 조건 표현식이다.
    expr, err := expression.NewBuilder().
      WithKeyCondition(
        expression.KeyEqual(expression.Key("directory"), expression.Value("finances"))).
      Build()
    assert.NoError(t, err)
    
    out, err := db.QueryWithContext(ctx, &dynamodb.QueryInput{
      ExpressionAttributeNames:  expr.Names(),
      ExpressionAttributeValues: expr.Values(),
      KeyConditionExpression:    expr.KeyCondition(),
      TableName:                 aws.String(table),
    })
    assert.NoError(t, err)
    assert.Len(t, out.Items, 4)
    
    이것은 매우 많은 새로운 사물이니, 내가 너를 위해 상세하게 소개할게.첫 번째 부분은 우리가 관건적인 조건 표현식을 구성하는 부분인데, 이것은 우리가 진정으로 조회하고자 하는 내용을 묘사한다.우리의 예에서, 이것은 단지 디렉터리 속성이 finances 과 같은 모든 항목일 뿐이다.나는 표현식 생성기를 사용하여 표현식의 구조를 간소화하고 있다.
    다음 단계에서, 우리는 검색에서 표현식을 사용할 것이다.우리는 조건, 명칭, 값을 제공해야 한다.이 예에서 조건은 단지 같은 비교일 뿐이다. 그 중에서 명칭은 속성 명칭에 대응하고 값은... 에 대응한다.그들의 가치관!
    표현식 대상을 사용하면 조건, 이름, 값에 쉽게 접근할 수 있습니다.보시다시피, 나는 그것들을 QueryInput의 매개 변수로 사용할 것이다.
    우리는 정말 네 개의 항목이 있는지 없는지, 나는 단지 목록을 찾고 있을 뿐이다.

    보너스-조회#3 2019년까지 보고


    사실은 내가 파일 이름을 정렬할 수 있도록 구축하는 방식을 증명한다.2019년까지 모든 보고서를 작성할 수 있도록 최대한 활용해 보겠습니다.
    질의가 동일하게 유지됩니다.우리가 유일하게 바꿔야 할 것은 관건적인 조건 표현식이다.
    expr, err := expression.NewBuilder().
    WithKeyCondition(
      expression.KeyAnd(
        expression.KeyEqual(expression.Key("directory"), expression.Value("finances")),
        expression.KeyLessThan(expression.Key("filename"), expression.Value("report2019")))).
    Build()
    assert.NoError(t, err)
    
    우리는 두 가지 조건이 AND 자구와 결합되어 있다.첫 번째는 섹션 키를 지정하고, 두 번째는 정렬 키를 지정합니다.KeyLessThan 우리는 report2018.pdfreport2017.pdf만 얻을 수 있도록 확보한다.조회 결과를 보여 주세요.
    var items []item
    err = dynamodbattribute.UnmarshalListOfMaps(out.Items, &items)
    assert.NoError(t, err)
    if assert.Len(t, items, 2) {
      assert.Equal(t, "report2017.pdf", items[0].Filename)
      assert.Equal(t, "report2018.pdf", items[1].Filename)
    }
    
    첫 번째 검색에서, 우리는 dynamodbattribute.UnmarshalMap 를 사용하여 하나의 다이나마이트 DB 항목을 구조에 그룹화합니다.우리는 우리가 프로젝트를 하나 얻을 수 있다는 것을 안다.여기에서, 우리는 한 개 이상의 항목이 있을 것을 알고 있기 때문에, 우리는 dynamodbattribute.UnmarshalListOfMaps 검색 결과를 항목의 슬라이드에 해제하는 것을 사용한다.
    첫 번째는 2017년 보고서이고 두 번째는 2018년 보고서라고 단언합니다.DynamoDB의 물건이 이 순서대로 돌아올 거라고 어떻게 확신할 수 있죠?다른 설명이 없으면 DynamoDB는 지정된 파티션의 항목을 오름차순으로 검색합니다.2017년은 2018년 전이기 때문에 첫 번째는 2017년이 될 거라는 것을 안다.

    요약


    오늘 우리는 복합 키를 어떻게 사용하는지 배웠다.그리고 우리는 그들의 바둑을 어떻게 활용하는지 안다!잘 됐다!뭐가 더 좋은지 알아요?코드 게임!이 저장소를 복제하고 패치해야 합니다.
    또한 expression builder를 사용하여 DynamoDB 표현식을 만듭니다.익숙해져라. 우리는 미래의 한 회에서 그것들을 대량으로 사용할 것이다.expression builder API를 사용하여 직각을 설정하는 데 시간이 좀 걸리지만, 이것은 충분히 가치가 있습니다!

    좋은 웹페이지 즐겨찾기