몽고DB를 이용하여 프로젝트를 진행하다가 데이터 모델을 바꾸게 되었다. 하지만 현재까지 더미로 만든 데이터들을 삭제하는 것보다는 유지하여 사용하는 것을 택하기로 하였다.
하지만 모델이 변경되면서 사용하지 않는 필드가 생겼으니, 이 필드와 필드값만 삭제시켜주기로 했다.
문제의 도큐먼트는 위와 같다. 현재 구현하는 SNS 서비스는 메시지를 남길 수 있고, 메시지에 대하여 댓글을 남기는 기능을 제공한다. 기존에는 댓글 도큐먼트를 따로 구성하여 Messages의 reply 필드의 배열에 추가하는 형식으로 댓글을 구현하려고 했다. 하지만 이처럼 구성을 할 때 여러 문제점들이 생겨났다.
댓글을 배열로 관리하던 필드를 다른 메시지의 id값을 참조하는 replyTo 필드로 바꿔주었다.
도큐먼트 모델이 바뀌어서 이제 사용되지 않는 필드값을 삭제하려고 한다. 위와 같이 '댓글 테스트 2'와 '여기는 들어가지?'라는 메시지에는 각각의 reply가 존재한다. 위 데이터만이 아닌 모든 데이터에서 해당 reply 필드를 삭제시켜주자.
[필드 삭제]
// mongosh
> db.messages.updateMany({},{$unset : {reply:""}})
적절하게 잘 삭제되었다.
NoSQL 을 이용하는 DBMS는 SQL을 이용하는 DBMS 보다 모델을 더 고민하게 된다. 모델의 변경과 적용은 당연히 쉽다. 하지만 정규화를 사용하는 기존의 방식은 모델을 구현하는 최소한의 규칙을 지키면 되었는데, 역정규화로 쿼리를 단순하게 만드는 것으로 관점이 달라졌기 때문인 것 같다. 자유에 대한 대가라고 생각한다.