• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

updateBoby 질문있습니다.

21.02.17 01:38 작성 조회수 111

2

findByIdAndUpdate(userId, updateBody,{new: true});

이부분에 기존에는 인자로 age등을 넘겨줬었던거 같은데용

음? userId로 해당 객체 찾고 두번쨰 인자로 해당 키의 값으로 접근하여 업데이트하는 거구나. 정도로 인식했습니다.

이번 강좌에서 새 객체를 넣었는데 이부분이 햇갈립니다. 객체 내부의 속성을 넣다가(2뎁스) 객체를 넣으니까(1뎁스) 혼동이 있는데요. 아래와 같이 추론한게 맞을까요?

findByIdAndUpdate에 두번째 인자로 객체를 넣으면 해당 객체 내부의 키값을 순회하면서 적용시키는 몽구스 내부로직이 있는건가요? 

답변 1

답변을 작성해보세요.

2

앗 햇갈릴 수 있는 부분인데 질문 해주셔서 감사합니다! 제가 설명이 부족했네요! 

몽구스가 몇가지 추가로 변환해주는 로직이 있긴 한데요. 질문하신 부분인 인자 대신에 updateBody객체를 사용하는거 자체는 몽구스랑 상관이 없어요! 이건 Javascript 문법 영역이에요. 

let updateBody = { age: 30, name: { first: "Elon", last: "Musk" } }

findByIdAndUpdate(userId, updateBody, { new: true })

위 코드는 아래와 완전히 동일한 코드에요.

findByIdAndUpdate(userId, { age: 30, name: { first: "Elon", last: "Musk" } }, { new: true })

대부분 첫번째의 경우처럼 updateBody를 선언해서 삽입할 필요 없이 두번째 코드처럼 간결하게 하면 되요.

근데 지금 다루는 상황은 age, name이 필수로 넘어오는게 아니고 넘어오는 인자만 수정하는 상황이에요. 두번째의 경우 age, name이 무조건 선언이 되기 때문에 age나 name이 넘어오지 않아도 무조건 몽고디비로 호출이 되죠. age가 넘어오지 않으면 그냥 기존 age가 남아 있어야 하는데 null로 업데이트 되어버리는거에요. 코드상으로는 이렇게 되는거죠.

findByIdAndUpdate(userId, { age: undefined, name: { first: "Elon", last: "Musk" } }, { new: true })

근데 이 경우 저희가 원하는건 아래 코드처럼 age인자가 아예 포함되지 않는거죠. 수정하고 싶지 않으니깐요.

findByIdAndUpdate(userId, { name: { first: "Elon", last: "Musk" } }, { new: true })

반대로 name이 제공되지 않고 age만 제공되면 이렇게 하고 싶구요.

findByIdAndUpdate(userId, { age: 30  }, { new: true })

둘다 제공되면 원래처럼 이렇게 하구요.

findByIdAndUpdate(userId, { age: 30, name: { first: "Elon", last: "Musk" } }, { new: true })

이렇게 상황에 따라 변경하는 인자들이 달라지면 updateBody를 따로 선언하고 변경하는 인자들만 조건에 따라 추가해주는거에요.

let updateBody = {} // 일단 업데이트할 빈 객체를 선언

if(age) updateBody.age = age // updateBody = { age: 30 }

if(name) updateBody.name = name // 만약 name이 제공되지 않았으면 이 부분은 실행 되지 않음.

findByIdAndUpdate(userId, updateBody, { new: true }) //findByAndUpdate(userId, { age: 30 }, { new: true })와 동일

다른 방법으로는 지금과 같이 updateBody에 들어갈 인자들이 많지 않으면 이렇게 할 수도 있어요.

if(age && name) findByIdAndUpdate(userId, { age, name }, { new: true })

else if(age) findByIdAndUpdate(userId, { age }, { new: true })

else if(name) findByIdAndUpdate(userId, { name }, { new: true }) 

else throw new Error("age, name중 하나는 존재해야합니다.")

이해 안되시는 부분 있으면 추가 질문 언제든지 남겨주세요!