๐Ÿง ๋‹ฌ๋ ฅ์—์„œ ์—ฐ์† 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 ์ฐธ๊ณ  ๋ฌธ์„œ

image

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š”, 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
		        }
		    ]
		}
	]
}