๐ง ๋ฌ๋ ฅ์์ ์ฐ์ 15์ผ๊ฐ์ ๋ฐ์ดํฐ๋ง ๋ฝ์์ ๋ณด์ฌ์ฃผ๋ API๋ฅผ ๋ง๋ค์ด๋ณด์
public async findDailyTrend({
date,
}: FindDailyTrendRequestDto): Promise<SvcResponse> {
const requestDate = new Date(
`${date.split('.')[0]}/${Number(date.split('.')[1])}/${Number(
date.split('.')[2]
)}`
);
const today = dayjs(requestDate).format();
let after15days;
await this.db // 1๏ธโฃ
.collection(`[COLLECTION NAME]`)
.aggregate([])
.toArray()
.then((allDailyDatasArr: any) => {
allDailyDatasArr.forEach((dailyDatas: any) => {
const date = new Date(dailyDatas.datas.timestamp).toLocaleString();
if (date === requestDate.toLocaleString()) {
after15days = dayjs(requestDate).add(15, 'day').format();
}
});
});
let resultArr = [];
await this.db // 2๏ธโฃ
.collection(`[COLLECTION NAME]`)
.find()
.toArray()
.then((allDatas) => {
allDatas.forEach((data: any) => {
if (
today <= dayjs(new Date(data.datas.timestamp)).format() &&
after15days > dayjs(new Date(data.datas.timestamp)).format()
) {
resultArr.push(data.datas);
}
});
});
return {
data: JSON.stringify(resultArr),
statusCode: HttpStatus.OK,
};
}
Mongo Shell์ ํตํด ๋๋ฏธ๋ฐ์ดํฐ ์์ฑํ๊ธฐ (๋๋คํ ๊ฐ ๋ฃ๊ธฐ)์ถ์ถํด๋์ daily ๋ฐ์ดํฐ๋ฅผ ํ๋ก ํธ์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๊ด๋ จ API๋ฅผ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํ๋ค.
์ฐ์ , ํ๋ก ํธ์์ ์ด๋ค์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋์ง์ ๊ดํด์ ๋งํด๋ณด๋ฉด, ์ ์ ๊ฐ ๋ฌ๋ ฅ์์ ํน์ ๋ ์ง๋ฅผ ํด๋ฆญํ๋ฉด, ํด๋น ๋ ์ง๋ก๋ถํฐ 14์ผ ํ์ ๋ฐ์ดํฐ๊น์ง, ์ฆ ์ด 15์ผ์น์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ํ๋ฅผ ํตํด ๋ณด์ฌ์ค ์์ ์ด๋ค.
Dayjs๋ฅผ ์ฌ์ฉํด๋ณด์
๋ ์ง ๊ณ์ฐ ๊ฐ์ ๊ฒฝ์ฐ ์ฒ์์๋ ์์ ํ๋ํ๊ฒ
new Date()
๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ฐํ๋๋ฐ ์ ๋๋ก๋ ๊ณ์ฐ์ด ์ด๋ ค์ ๋ค. (์๋ฒ๋ฅผ ๋๋ฆด ๋๋ง๋ค ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์จ๋ค๊ฑฐ๋, param๊ฐ์ผ๋ก ๋ค์ด๊ฐ date ๊ฐ์ด ๋ฐ๋๋ฉด 15๊ฐ๊ฐ ์๋ 300๊ฐ์ฉ ๋ฆฌํด๋๋ค๊ฑฐ๋์ ๊ฐ์ ๋๋ฌด ์๊ฐ์ง๋ ๋ชปํ ์ค๋ฅ ์ํฉ์ด ๋์๋ค.)
์ด๋ฐ๊ฑธ๋ก ์ด๋ ค์์ ๊ฒช๊ณ ์๋๊ฑธ ๋ณธ ํ์์ด ๊ทธ๋ ๊ฒ ํ์ง ๋ง๋ผ๊ณ ํ๋๋ผโฆ dayjs๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋ฉด ์์ฝ๊ฒ ํ ์ ์๋ค๊ณ ํ์๋ฉด์ ์ถ์ฒํด์ฃผ์ จ๋๋ฐ 1์๊ฐ๋์ ๋๋๋๋ ๋ฌธ์ ๊ฐ 1๋ถ๋ง์ ํด๊ฒฐ๋ผ๋ฒ๋ ธ๋ค.๐ฅฒ
๐ฑ dayjs ์ฐธ๊ณ ๋ฌธ์
์ด๋ฅผ ์ํด์๋, mongodb์ ์ ์ฅํด๋์ ์ ๋ฐ์ดํฐ์ ๊ฐ์ด timestamp๋ก ํํ๋์ด ์๋ ๋ ์ง ๋ฐ์ดํฐ๋ฅผ ํตํด ํด๋น ๊ณผ์ ์ ๊ตฌํํ ์ ์๋ค.
1๏ธโฃย ์์ฒญ์ผ๋ก ๋ค์ด์จ ๋ ์ง์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ํด๋น์ปฌ๋ ์ ์์ ์ฐพ์ timestamp๋ผ๋ ์ปฌ๋ผ์ 15์ผ ํ์ ๋ ์ง๋ฅผ ๊ตฌํ์ฌ after15days๋ผ๋ ๋ณ์์ ํ ๋นํ์๋ค.
2๏ธโฃย ํด๋น ์ปฌ๋ ์ ์์ 1๋ ์น ๋ฐ์ดํฐ์ ๊ดํ์ฌ forEach๋ฅผ ํตํด ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ํ๋ก ํธ๋ก๋ถํฐ ์์ฒญ์จ ๋ ์ง (๋ณ์
today
)์today
์์ 15์ผ ํ์ ๋ ์ง ์ฌ์ด์ ์๋ ๋ ์ง๋ค์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ค์ ๋น ๋ฐฐ์ด์ pushํ๋ค.
โ๏ธ ์ ์ฝ๋๋ service ๋ถ๋ถ์ ํด๋นํ๋ ์ฝ๋์ด๊ณ controller์ module๊น์ง ๋ชจ๋ ๊ตฌ์ฑํ ํ (์ด ๋ถ๋ถ์ ์๋ตํ๊ฒ ๋ค.) postman์ผ๋ก (date=2022/2/22์ผ๋ก param๊ฐ์ ๋ณด๋ธ ํ) return ๊ฐ์ ํ์ธํด๋ณด๋ ๋ค์๊ณผ ๊ฐ์๋ค.
{
"statusCode": 200,
"data": [
{
"timestamp": "2/1/2022, 12:00:00 AM",
"dailyEC2Stats": [
{
"region": "ap-northeast-2",
"isAllowed": true,
"countTotalEC2": 74,
"countUnmanagedEC2": 65,
"countUnallowedSpec": 1
},
{
"region": "us-east-1",
"isAllowed": true,
"countTotalEC2": 89,
"countUnmanagedEC2": 46,
"countUnallowedSpec": 6
},
{
"region": "ap-northeast-3",
"isAllowed": true,
"countTotalEC2": 109,
"countUnmanagedEC2": 100,
"countUnallowedSpec": 0
},
{
"region": "ap-northeast-1",
"isAllowed": true,
"countTotalEC2": 111,
"countUnmanagedEC2": 104,
"countUnallowedSpec": 4
},
{
"region": "sa-east-1",
"isAllowed": true,
"countTotalEC2": 116,
"countUnmanagedEC2": 21,
"countUnallowedSpec": 6
}
]
},
.
.
.
{
"timestamp": "2/15/2022, 12:00:00 AM",
"dailyEC2Stats": [
{
"region": "ap-northeast-2",
"isAllowed": true,
"countTotalEC2": 74,
"countUnmanagedEC2": 44,
"countUnallowedSpec": 1
},
{
"region": "us-east-1",
"isAllowed": true,
"countTotalEC2": 93,
"countUnmanagedEC2": 82,
"countUnallowedSpec": 5
},
{
"region": "ap-northeast-3",
"isAllowed": true,
"countTotalEC2": 102,
"countUnmanagedEC2": 43,
"countUnallowedSpec": 1
},
{
"region": "ap-northeast-1",
"isAllowed": true,
"countTotalEC2": 111,
"countUnmanagedEC2": 81,
"countUnallowedSpec": 2
},
{
"region": "sa-east-1",
"isAllowed": true,
"countTotalEC2": 107,
"countUnmanagedEC2": 97,
"countUnallowedSpec": 3
}
]
}
]
}