Icon_MongoDB_by_xkneo

왜 몽고디비에서는 object 검색이 잘 되지 않는가?

왜 몽고디비에서는 object 검색이 잘 되지 않는가?

*db.orders.find(   { info : { name : ‘박승현’ , age : 20 } }   );  이런 질의가 있다고 가정해보자.  이걸 몽고 디비에서는 **db.orders.find(   {$and : [ {‘info.name’ : ‘박승현’} , {‘info.age’ : 20} ]}  ) 으로 해야 정확한 결과가 나온다. 만약 orders 컬렉션에 해당 문서가 { info : { age : 20 , name : ‘박승현’ } , year:2014 }  라고 들어 있으면 첫번째질의는 검색이 되지 않는다. (하위 오브젝트의 순서가 바뀐것)

즉, 몽고디비는 name 이 ‘박승현’이고 age 가 20 인 doc 를 검색 하지 않는다. 그저 info 라는 key 에 value 값을 무슨 String 값이나 binary 처럼 단순 비교함을 유추할수 있다.

왜 일까? 만약 doc 가 단순한 수준이 아니라 1.하위에 여러 depth 를 가지고 있다거나 2.배열이라거나 3. key 가 8760개가 들어있는 시계열 데이터 문서들을 저장한 컬렉션 이라면? 이런 모든 경우의 수를 json 으로 인식해서 검색해주면 정말 눈물나게 고맙긴 하겠지만 아마 그 속도때문에 느려터진 괴물로 생각하고 버렸을것이다.

그럼 어떻게? “Dot notation” 또는 “$and, $or, $in …. ” 등의 선언자들을 써줘야 우리 몽고디비 파서는 질의를 판단해서 오브젝트 하위나 배열을 뒤저야 겠구나 생각하고 그제서야 bson 을 파싱해서 하위 오브젝트 까지 관심을 갖는것. 결국 몽고디비는 별다른 조건이 없으면 첫번째 level 의 key 가 가진 value 값만 “단순 비교” 한다는 것. 

이건 몽고디비의 사상이다. 속도를 위해서 디테일한 편의를 포기하는것.(실제로는 다른형태로 제공) “object 단위로 검색이 되지 않는다” , “쿼리가 너무 불편하다” 등 속도를 포기해야 하는 이런 기능에 대하여 불편을 느낀다면 몽고디비같은건 만들어 쓰자. 우린 개발자니까.

 

  • Facebook
  • Google Plus
  • Twitter
  • LinkedIn
  • Pinterest
  • Tumblr
  • Instapaper
  • Delicious