mongoDB
-
Session 사용하여 여러 collection을 한번에 처리하기mongoDB 2024. 4. 28. 15:38
RDB같은 경우에는 atomic성이 항상 보존되기 때문에 이에 대한 생각을 할 필요가 없지만, mongoDB는 그렇지 않기 때문에 일련의 과정으로 처리해야할 경우 session을 사용해서 이를 보장해야 한다. (mongodb 4.0 version 부터 사용 가능하다.) session 기능은 standalone에서는 동작하지 않기 때문에 replica set 구성을 해 주어야 한다. nestjs에서 사용하였고 이를 간단히 요약해서 말하자면 아래와 같은 순서로 동작한다고 볼 수 있다.session을 시작한다.DB에 접근할 때 session 정보를 같이 전달한다.모든 session이 정상적으로 완료되었으면 commit을 한다.만약 중간에 에러가 발생하면 session을 abort 시킨다.session을 종료..
-
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에..
-
MongoDB Version up에서 발생한 추가 문제사항mongoDB 2022. 6. 6. 12:40
2022.03.09 - [mongoDB] - Nodejs에서 mongoDB, mongoose Version Upgrade Nodejs에서 mongoDB, mongoose Version Upgrade 이유 legacy system에서 mongoDB version 3.2.11을 replica set으로 사용중인데 현재 몽고는 version 5까지 나왔는데 더 늦게전에 version upgrade를 할 필요를 느꼈다. 방법 서치 mongoDB 공식 문서를 보니 v.. zzihyeon.tistory.com Dev Server에서는 mongo-message-queue module만 문제가 있었는데 prod서버에서 미처 고려하지 못한 문제를 발견하게 되었다. 1. Node.js mongoose에서 mongo gfs..
-
MongoDB - index (2)mongoDB 2022. 5. 29. 18:49
2022.04.17 - [mongoDB] - MongoDB - index (1) 에 이어서 작성하도록 하겠다. Index properties index에는 여러 property들이 있는데 이에 대해 간단하게 설명하도록 하겠다. TTL Indexes 정해진 시간 이후에 자동으로 document를 지울 때 사용하는 index이다. (만약 timeseries collection을 사용한다면 index가 아닌 collection의 option에 expireAfterSeconds를 추가해야한다.) db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } ) Replica Set의 경우에는 TTL background thread..
-
MongoDB - index (1)mongoDB 2022. 4. 17. 16:08
Index는 왜 필요할까? Index는 mongoDB에서 효율적인 쿼리 실행을 도와준다. 만약 index가 없다면 쿼리에 맞는 data를 찾기 위해서 collection의 모든 document를 scan해야 한다. MongoDB에서는 기본적으로 _id field에 대해 index가 존재한다. Index는 collection의 data set의 작은 부분을 특정 형태의 data structure로 저장한다. 특정한 field나 field의 집합의 값을 값에 따라 순서대로 저장한다. Single Index 위의 예시를 보면 score 기준으로 indexing을 하고 score: { "$lt": 30 } 이라는 query를 실행했다. 만약 index가 없었다면 collection의 모든 data의 score ..
-
MongoDB - Data modeling (2)mongoDB 2022. 4. 16. 15:16
2022.04.14 - [mongoDB] - MongoDB - Data modeling (1) 에 이어서 이제 좀 더 심도 있게 알아보도록 하자 The Number of Collections 개발을 하다보면 하나의 collection에 data를 다 저장할지 아니면 세분화해서 여러 collection에 나누어 저장할지 고민해야 되는 상황이 올 수 있다. 예를 들어서 log 정보를 관리하고자 한다고 생각해 보자. { log: "prod", ts: ..., info: ...} { log: "dev", ts: ..., info: ... } { log: "debug", ts: ..., info: ...} 여기서 만약 전체 documents의 수가 적으면 그냥 collection하나에 type으로 document..
-
MongoDB - Data modeling (1)mongoDB 2022. 4. 14. 07:24
data modeling은 왜 필요할까? 무엇인가를 개발할 때 우리는 어플리케이션의 요구사항, 데이터베이스 엔진 성능 그리고 검색 패턴의 균형을 잘 맞춰야만 한다. 즉, 개발 도메인에 맞는 데이터 구조를 파악하고 이에 맞는 데이터베이스 엔진을 선택하고 또 이를 어떻게 사용할지 고려해야만 한다. 그럼 이제 mongoDB의 Data Modeling에 대해 알아보도록 하자. Flexible Schema mongoDB는 noSQL 데이터베이스로써 SQL( Data를 insert하기 전에 Table의 column 즉 Schema을 정해놔야 함)과 다르게 동일 collection의 document들의 schema가 동일할 필요가 없다. document의 특정 field를 삭제하거나 추가하려면 다른 작업이 필요없이 ..
-
MongoDB - Read ConcernmongoDB 2022. 4. 4. 00:17
MongoDB CRUD - 어떻게 완화된 ACID (BASE) 인가? :: 개발 일지 (tistory.com) 에서 마지막에 알아 본 concern의 이해가 어려울 것으로 생각된다. 그래서 mongoDB 문서에 나와있는 예를 들어가며 간단하게 설명하고자 한다. Read Concern local, available "local"은 리턴 한 data가 replica set member들에 data가 써졌음을 보장하지 않는다. 이제 어떻게 동작하는지 알아보자. Write Prev = write 이전 값 Write After = w: "majority" write 이후 실제 쓰여진 값 ~t0 t0~t1 t1~t2 t2~t3 t3~t4 t4~t5 t5~t6 primary Write Prev Write After ..