DynamoDB에서 정보를 쿼리하는 간단한 TypeScript 클래스

일부 사람들이 유용하다고 생각하는 DocClient용 래퍼를 작성했습니다. 주요 목적은 특히 DynamoDB를 호출하는 Lambda 함수의 경우 데이터 검색 및 삽입을 단순화하는 것입니다. 코드here를 볼 수 있습니다.

다음을 통해 다운로드할 수 있는 aws-sdk, lodash 및 uuid가 필요합니다.

npm install aws-sdk lodash uuid


또한 id를 기본 키로 사용한다고 가정하며, 대부분의 경우입니다.

어떻게 작동하는지 봅시다. 흥미로울 수도 있습니다!

건설자



테이블 이름으로 클래스의 새 인스턴스를 시작해야 합니다.

const posts = new DynamoTable('posts', 'us-east-1'); // the region is optional


클래스에 이름을 저장하는 이점 중 하나는 프로덕션과 개발 모두에 동일한 변수를 사용할 수 있다는 것입니다.

const posts = new DynamoTable(isProd ? 'posts' : 'dev_posts', 'us-east-1'); 


행동 양식



이 인스턴스에는 이제 다음 메서드가 포함됩니다.
  • addItem(item)
  • updateItem(item)
  • deleteItem(id)
  • getItem(id)
  • batchGetItem(ids)
  • batchWriteItem(ids)
  • scan({ nextToken, limit, filter })
  • simpleScan(filter)
  • scanAll(filter)
  • query(index, queryExpression, nextToken, limit, filter)
  • simpleQuery(index, queryExpression, filter)
  • queryAll(index, queryExpression, filter)

  • 그것들을 사용하는 방법을 보자!

    삽입


    addItem 로 단일 항목을 추가할 수 있습니다. ID를 전달하면 자동으로 ID가 생성됩니다.

    import DynamoTable from './DynamoTable';
    
    const posts = new DynamoTable('posts', 'us-east-1'); // the region is optional
    
    async function main() {
      const post = {
        title: 'New post',
        content: 'I am the body!'
      };
    
      const newPost = await posts.addItem(post);
      console.log(newPost);
      /*
        {
          id: '7da9576c-a97c-47fc-a884-fbc7fda3ab3a',
          title: 'New post',
          content: 'I am the body!'
        }
      */
    }
    
    main();
    

    batchWriteItem를 사용하여 여러 항목을 삽입할 수 있습니다.

    import DynamoTable from './DynamoTable';
    
    const posts = new DynamoTable('posts', 'us-east-1'); // the region is optional
    
    async function main() {
      const post1 = {
        title: 'New post 1',
        content: 'I am the body of post 1!'
      };
      const post2 = {
        title: 'New post 2',
        content: 'I am the body of post 2!'
      };
    
      await posts.batchWriteItem([post1, post2]);
    }
    
    main();
    


    업데이트 중



    업데이트할 필드만 지정할 수 있는 updateItem 를 사용하여 게시물을 업데이트할 수 있습니다. 또한 API에 대한 응답으로 전달할 수 있도록 전체 항목을 반환합니다.

    import DynamoTable from './DynamoTable';
    
    const posts = new DynamoTable('posts', 'us-east-1'); // the region is optional
    
    async function main() {
      const postUpdated = {
        id: '7da9576c-a97c-47fc-a884-fbc7fda3ab3a',
        title: 'New post updated',
      }
    
      const newPost = await posts.updateItem(postUpdated);
      console.log(newPost);
      /*
        {
          content: 'I am the body!',
          id: '7da9576c-a97c-47fc-a884-fbc7fda3ab3a',
          title: 'New post updated'
        }
      */
    }
    
    main();
    


    검색 중



    이 클래스는 데이터를 검색하는 4가지 방법(단일 항목, 여러 항목, 스캔 ​​또는 쿼리를 통한 목록)을 지원합니다.

    가장 간단한 것은 ID를 사용하여 간단한 항목을 가져오는 것입니다.

    import DynamoTable from './DynamoTable';
    
    const posts = new DynamoTable('posts', 'us-east-1'); // the region is optional
    
    async function main() {
      const post = await posts.getItem('7da9576c-a97c-47fc-a884-fbc7fda3ab3a');
      console.log(post);
      /*
        {
          content: 'I am the body!',
          id: '7da9576c-a97c-47fc-a884-fbc7fda3ab3a',
          title: 'New post updated'
        }
      */
    }
    
    main();
    


    그러나 ID를 사용하여 여러 항목을 가져올 수도 있습니다.

    const items = await posts.batchGetItem([
      '767311af-b122-420d-9b7f-a5692dbfbd45',
      'd7fce7ab-252f-4b66-a1f8-fc940db14f5c',
    ]);
    console.log(items);
    /*
    [
      {
        authorId: '1',
        content: 'Title 1',
        id: '767311af-b122-420d-9b7f-a5692dbfbd45',
        title: 'Post 1'
      },
      {
        authorId: '2',
        content: 'Title 3',
        id: 'd7fce7ab-252f-4b66-a1f8-fc940db14f5c',
        title: 'Post 3'
      }
    ]
    */
    


    테이블을 스캔하는 방법에는 세 가지가 있습니다. 기본scan 방법은 스캔을 사용하는 방식에 친숙합니다. 페이지 매김을 무시하는 simpleScan 방법과 더 이상 데이터가 없을 때까지 데이터를 계속 검색하는 scanAll 방법.
    scan 메서드는 nextToken , limitfilter 의 3개 필드가 있는 하나의 매개변수를 허용합니다.
  • nextToken는 DynamoDB에 이 키 다음에 항목을 검색하도록 지시합니다.
  • limit는 검색할 최대 항목 수를 결정합니다.
  • filter{ key: value }(키 = 값) 또는 expressionvalues(attribute_not_exists(:example) )
  • 와 같은 객체일 수 있습니다.

    메서드는 items(배열) 및 nextToken(문자열 또는 null)를 반환합니다.

    다음과 같이 테이블에서 모든 항목을 검색할 수 있습니다.

    const postsScan = await posts.scan();
    console.log(postsScan);
    /*
      {
        items: [
          {
            content: 'I am the body!',
            id: '7da9576c-a97c-47fc-a884-fbc7fda3ab3a',
            title: 'New post updated'
          },
          {
            content: 'I am the body of post 1!',
            id: '7796b42d-4e20-4cc1-ab85-ca3240da5991',
            title: 'New post 1'
          },
          {
            content: 'I am the body of post 2!',
            id: 'fb4d00ab-ffd8-473d-8e5f-bb506506ab30',
            title: 'New post 2'
          }
        ],
        nextToken: null
      }
    */
    

    scanAll를 수행하여 더 이상 항목이 없을 때까지 항목을 계속 검색할 수 있습니다.

      const postsScan = await posts.scanAll();
      console.log(postsScan);
      /*
        [
          {
            content: 'I am the body!',
            id: '7da9576c-a97c-47fc-a884-fbc7fda3ab3a',
            title: 'New post updated'
          },
          {
            content: 'I am the body of post 1!',
            id: '7796b42d-4e20-4cc1-ab85-ca3240da5991',
            title: 'New post 1'
          },
          {
            content: 'I am the body of post 2!',
            id: 'fb4d00ab-ffd8-473d-8e5f-bb506506ab30',
            title: 'New post 2'
          }
        ]
      */
    


    단순simpleScan은 페이지 매김 정보 없이 스캔의 첫 번째 배치를 반환합니다.

    필터링



    쿼리로 이동하기 전에 "authorId"키를 테이블posts에 추가하여 이를 사용하여 스캔하고 필터링합니다.

    const postsToInsert = [
      {
        authorId: '1',
        content: 'Title 1',
        title: 'Post 1',
      },
      {
        authorId: '1',
        content: 'Title 2',
        title: 'Post 2',
      },
      {
        authorId: '2',
        content: 'Title 3',
        title: 'Post 3',
      },
      {
        authorId: '4',
        content: 'Title 4',
        title: 'Post 4',
      },
    ];
    
    await posts.batchWriteItem(postsToInsert);
    


    이제 "authorId"를 스캔하고 필터링할 수 있습니다.

    const postsByAuthor1 = await posts.scan({ filter: { authorId: '1' } }); // expression would be authorId = 1
    console.log(postsByAuthor1);
    /*
    {
      items: [
        {
          authorId: '1',
          content: 'Title 1',
          id: '767311af-b122-420d-9b7f-a5692dbfbd45',
          title: 'Post 1'
        },
        {
          authorId: '1',
          content: 'Title 2',
          id: 'a46ec412-1e95-4c9c-a24e-1d4d15092d3f',
          title: 'Post 2'
        }
      ],
      nextToken: null
    }
    */
    


    보다 복잡한 필터 또는 사용자 지정 필터의 경우 식과 값을 사용할 수 있습니다.

    const postsByAuthor1 = await posts.scan({
      filter: {
        expression: 'authorId = :authorId',
        values: {
          authorId: '1'
        }
      }
    });
    console.log(postsByAuthor1);
    /*
    {
      items: [
        {
          authorId: '1',
          content: 'Title 1',
          id: '767311af-b122-420d-9b7f-a5692dbfbd45',
          title: 'Post 1'
        },
        {
          authorId: '1',
          content: 'Title 2',
          id: 'a46ec412-1e95-4c9c-a24e-1d4d15092d3f',
          title: 'Post 2'
        }
      ],
      nextToken: null
    }
    */
    


    쿼리



    이제 'authorId-index'라는 'authorId' 필드에 대한 색인을 만들 수 있습니다.

    const postsByAuthor1 = await posts.query({
      index: 'authorId-index',
      queryExpression: { authorId: '1' }
    });
    console.log(postsByAuthor1);
    /*
    {
      items: [
        {
          content: 'Title 1',
          authorId: '1',
          id: '767311af-b122-420d-9b7f-a5692dbfbd45',
          title: 'Post 1'
        },
        {
          content: 'Title 2',
          authorId: '1',
          id: 'a46ec412-1e95-4c9c-a24e-1d4d15092d3f',
          title: 'Post 2'
        }
      ],
      nextToken: null
    }
    */
    

    query는 쿼리 후 결과에 대해 스캔과 매우 유사한 filter , nextTokenlimit도 허용합니다.
    simpleQuery와 같이 simpleScan를 사용할 수도 있습니다.

    const postsByAuthor1 = await posts.simpleQuery('authorId-index', { authorId: '1' });
    console.log(postsByAuthor1);
    /*
    [
      {
        content: 'Title 1',
        authorId: '1',
        id: '767311af-b122-420d-9b7f-a5692dbfbd45',
        title: 'Post 1'
      },
      {
        content: 'Title 2',
        authorId: '1',
        id: 'a46ec412-1e95-4c9c-a24e-1d4d15092d3f',
        title: 'Post 2'
      }
    ]
    */
    

    simpleQuery는 페이지 매김을 처리하지 않으며(따라서 더 많은 항목이 있을 수 있음) 세 번째 매개 변수로 필터를 허용합니다.

    또한 페이지 매김을 처리하고 모든 항목이 검색될 때까지 계속 쿼리하는 메서드queryAll가 있습니다.

    const postsByAuthor1 = await posts.queryAll('authorId-index', { authorId: '1' });
    console.log(postsByAuthor1);
      /*
    [
      {
        content: 'Title 1',
        authorId: '1',
        id: '767311af-b122-420d-9b7f-a5692dbfbd45',
        title: 'Post 1'
      },
      {
        content: 'Title 2',
        authorId: '1',
        id: 'a46ec412-1e95-4c9c-a24e-1d4d15092d3f',
        title: 'Post 2'
      }
    ]
    */
    


    삭제


    deleteItem 방법을 사용하여 항목을 삭제할 수 있습니다.

    const deletedPost = await posts.deleteItem('a46ec412-1e95-4c9c-a24e-1d4d15092d3f');
    console.log(deletedPost);
    /*
    {
      authorId: '1',
      content: 'Title 2',
      id: 'a46ec412-1e95-4c9c-a24e-1d4d15092d3f',
      title: 'Post 2'
    }
    */
    


    이것이 유용하길 바랍니다!

    좋은 웹페이지 즐겨찾기