예전에 mongoose로
doc:{
val1:값,
val2:값,
arr:[배열]
}
이런 테이블이 있을때
arr을 수정하려고 하면 이때까지
doc 찾고 그안에서 arr을 직접 수정한다음에
다시 doc을 업데이트 하는 방식으로 했었음
코드로 요약하자면
schema.findById('doc 아이디',(err,res)=>{
res.arr //doc안에 arr 수정
//수정된 배열
schema.findByIdAndUpdate('doc 아이디', res.arr,[콜백])
})
이딴식으로 찾고,바꾸고,다시 덮어쓰고 이짓거리 했는데
js 객체 처럼 그냥 doc을 찾아서 doc.arr.pop() 이런식으로
바로바로 수정하고 다시 저장할 방법없냐 질문 했었는데
오늘 api문서 읽어보고 알아냈음
알고보니 api 시작하기 문서에 있던건데 이제 알았음
위에 처럼 지랄할 필요없이
const doc=await schema.findById('doc 아이디')
먼저 이렇게 doc을 찾아서 가져오고
doc 변수 자체를 그냥 수정이 가능하더라고
doc.val1='수정됨'
doc.val2='ㅇㅇ'
이런식으로 js 객체처럼 그냥 수정한다음
doc.save() 라는거 호출해주면 알아서 수정,저장이됨
이 save()라는 메소드가 일종의 문법 설탕이더라
save 호출하면 몽구스가 알아서 업데이트 쿼리 날려준다고 하네
존나 편한 기능인데 이걸 이제 알았음
근데 또하나 문제가 있었는데
도큐먼트안에 배열을 수정했을땐 반영이 안돼더라
구글에 한번 찾아봤는데 이런 답변이 있었음
배열을 수정했을땐 markModified() 라는걸 호출하라는데
솔직히 이게 무슨메소드고 무슨역할인지 모르겠음
api문서 에서도 설명이 부족해서 뭔지 못알아보겠던데 아무튼 이렇게 해야 배열도 정상적으로 저장되더라
mongoose는 잘 모르는데 내가 봤을 때는 변경된 내역만 저장하기 위해 배열을 일일이 뒤져서 변경되었는지 확인할 수 없으니까 변경되었다고 표시하는 거 같은데. immutable한 객체사용하는 대신 저렇게 하는 듯