DynamoDB에서 정보를 쿼리하는 간단한 TypeScript 클래스
다음을 통해 다운로드할 수 있는 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
, limit
및 filter
의 3개 필드가 있는 하나의 매개변수를 허용합니다.nextToken
는 DynamoDB에 이 키 다음에 항목을 검색하도록 지시합니다. limit
는 검색할 최대 항목 수를 결정합니다. filter
는 { key: value }
(키 = 값) 또는 expression
및 values
(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
, nextToken
및 limit
도 허용합니다.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'
}
*/
이것이 유용하길 바랍니다!
Reference
이 문제에 관하여(DynamoDB에서 정보를 쿼리하는 간단한 TypeScript 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zerquix18/a-simple-typescript-class-to-query-information-from-dynamodb-2hce텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)