-
mongoDB에서 data history 관리하기mongoDB 2022. 7. 31. 17:34
문제사항
- 현재 사용하는 mongoDB에서는 과도하게 하나의 doc에 데이터를 embedded 시켜서 document 사이즈를 초과하게 되는 문제가 발생했다. 이는 history관련 로직이 문제였는데, 특정 data가 수정되었을 때 새로운 doc를 생성해서 관리하는 것이 아닌 history라는 배열에 이전 정보를 보관해서 저장하기 때문에 문제가 되었다. 사실 one-to-many이지만 one-to-few이기 때문에 embedded시켜도 문제가 없어야 하지만 애초에 doc사이즈가 매우 크기 때문에 문제가 발생했다.
해결 방법
- 이를 해결하기 위해 parent, visible 필드를 추가하고 data가 변경되면 기존의 doc을 clone하여 현재 상태의 snapshot으로 doc을 하나 생성한 뒤 parent에는 clone한 대상(맨 처음 생성한 doc)의 id를 적고 visible: false로 변경하여 query 조회 시에는 보이지 않도록 조치하였다.
- 맨 처음 생성한 doc는 parent가 된다. 만약 새로운 doc를 parent로 변경하게 되면 id가 변경되기 때문에 해당 collection의 data에 대해 id로 reference를 갖고 있는 다른 doc에서의 접근이 최신 정보를 가져올 수 없게 된다.
- update시에 기존 doc을 clone하여 새로운 doc로 저장한다. 이 때, visible field를 false로 변경하여 query로 보이지 않게 조치하고 parent에 처음 생성한 doc의 id를 넣는다.
- clone한 뒤에 변경한 정보에 맞게 최초 생성한 doc를 update한다. 이 때 version에 1을 더해준다.
'mongoDB' 카테고리의 다른 글
Session 사용하여 여러 collection을 한번에 처리하기 (0) 2024.04.28 MongoDB Version up에서 발생한 추가 문제사항 (0) 2022.06.06 MongoDB - index (2) (0) 2022.05.29 MongoDB - index (1) (0) 2022.04.17 MongoDB - Data modeling (2) (0) 2022.04.16