Database/MongoDB 2019. 9. 19. 10:38

 

MongoDB의 Insert 문은 2개의 인자가 들어간다. 첫번째 인자는 삽입할 문서, 두번째 인자는 선택적인 옵션이다. 여기서 오늘 알아볼 것은 두번째 인자중 ordered에 대해서 알아볼 것이다. 

 

우선 몽고디비에서는 디폴트로 ordered가 true인 상태에서 삽입을 수행한다. ordered가 true라는 것은 무슨 뜻일까? 만약 삽입하는 문서가 단일 문서가 아니고, insertMany를 사용하여 여러 문서를 한번에 삽입하는 상황을 생각해보자. 만약 ordered가 true라면 싱글 스레드로 삽입하려는 여러개의 문서(배열)를 명시된 순서대로 하나씩 삽입할 것이다. 순서가 중요한 상황이라면 유용할 것이다. 하지만 ordered가 false라면 멀티스레드로 여러 문서를 병렬로 삽입한다. 

 

그렇다면 당연히 ordered를 false로 하는 것이 좋지 않냐라는 생각이 들 수 있다. 답은 상황에 따라 다르다는 것이다. 아래와 같은 상황을 생각해보자.

 

> db.insertcollection.createIndex({name:1},{unique:true})

> db.insertcollection.insertMany([{name:"a"},{name:"a"},{name:"c"},{name:"b"}],{ordered:true})

 

 

유니크한 인덱스 필드로 "name"필드를 지정하였고 벌크로 4개의 문서를 삽입하는 상황이다.(ordered:true는 생략가능) 이 삽입 쿼리는 어떤 결과를 반환할까? 아마 유니크한 인덱스인데 중복된 값이 들어왔다는 예외를 반환할 것이다. ordered가 true라면 몽고디비는 내부적으로 예외가 발생한 시점에서 삽입연산을 마치게 된다. 그 말은 위의 쿼리에서 name:"a"라는 문서하나만 삽입되고 나머지는 삽입연산 수행이 중지 될 것이다. 그렇다면 아래와 같은 쿼리는 어떻게 될까?

 

> db.insertcollection.insertMany([{name:"a"},{name:"a"},{name:"c"},{name:"b"}],{ordered:false})

 

 

분명 중복 예외가 발생했음에도 불구하고 예외가 발생한 문서를 제외하고 모두 삽입이 되었다. 이것이 바로 ordered 옵션의 차이점이다. ordered가 true라면 단일스레드가 순차적으로 문서를 삽입하다 예외가 발생하면 그 상태에서 작업을 멈추지만, ordered가 false라면 예외가 발생하여도 그 문서만 무시하고 나머지 작업을 계속 수행하게 된다.

 

무엇이 좋고 나쁨을 사실 이야기하기 힘들다. 상황에 맞게 사용하는 것이 좋을 듯하다.

posted by 여성게
: