mongoDB로 데이터 전송시키는 작업을 할 때... 자꾸 'name'이라는 항목에서 중복 키 에러가 났다.
User
ongoServerError: E11000 duplicate key error collection: product_items.defaults index: name_1 dup key: { name: null }
at InsertOneOperation.execute (/Users/jy/Documents/coding/kjy-shop/node_modules/mongodb/lib/operations/insert.js:48:19)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async executeOperationAsync (/Users/jy/Documents/coding/kjy-shop/node_modules/mongodb/lib/operations/execute_operation.js:106:16) {
index: 0,
code: 11000,
keyPattern: { name: 1 },
keyValue: { name: null },
[Symbol(errorLabels)]: Set(0) {}
}
name에 null값이 중복으로 들어가서 생기는 문제였다. 기존엔 name 항목을 unique로 지정해놨기 때문에. 그런데 나는 스키마를 이미 name이 아니라 productName으로 변경한 상태였다 ㅠㅠ 왜 자꾸 name이라는 항목에서 에러가 나는지 알 수 없었다...
한참 고생한 뒤에야 원인을 찾았다.

쉘에서 해당 데이터베이스를 뜯어보니 이전에 생성된 고유 인덱스로 name_1이 남아있었다....!
# MongoDB 쉘에서
db.defaults.getIndexes() // defaults 컬렉션의 모든 인덱스를 찾아옴
db.defaults.dropIndex("name_1") //그리고 이걸로 제거했음
bcrypt라는 라이브러리를 import하여 패스워드를 암호화하는 시도를 해 보았다.
1) 새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.
//내가 짠 코드
let solution = (price, money, count) => {
let total = 0;
for(i = 1; i <= count; i++){
total += price*i;
}
return money - total < 0 ? total - money : 0
}
//다른 사람 코드
function solution(price, money, count) {
const tmp = price * count * (count + 1) / 2 - money;
return tmp > 0 ? tmp : 0;
}
//다른 사람 코드 2
const solution = (..._) => Math.max(_[0]*_[2]*++_[2]/2-_[1], 0);
가우스의 합공식
연속된 자연수의 합을 계산하는 데 사용되는 공식으로, n(n+1)/2 형태로 나타낼 수 있다. 여기서 n은 가장 큰 자연수.
전체 횟수 * 가격 / 2로 총비용을 먼저 계산하고 소지금을 빼준 듯... 수학을 잘해야 하는구나...
다른 사람의 두 번째 코드도 똑같이 가우스의 합공식을 사용했는데, 인자를 배열 형식으로 받아와 간결하게 보이도록 한 듯... 그런데 읽기가 너무 힘들다...
2) 문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
//내가 짠 코드
let solution = s => {
if(s.length !== 6 && s.length !== 4) {
return false;
}
if(String(s).includes('e')) {
return false
}
return !Number.isNaN(s*1)
}
//다른 사람 코드
function alpha_string46(s){
var regex = /^\d{6}$|^\d{4}$/;
return regex.test(s);
}
11번 테스트에서 자꾸 실패가 뜨길래 대체 뭐가 문제지 하고 힌트를 봤더니... 11번에 지수(e)가 포함되어 있는데, 그걸 isNaN 등 숫자인지 판별하는 곳에 넣으면 e를 숫자로 인식해버린다고 한다. 그래서 중간에 e가 들어있는지 점검하는 코드를 추가해 주었다. 그런데 정규식이 훨씬 깔끔하긴 하구나...