티스토리 툴바


Java에서 MongoDB를 사용하기 위해 Java Driver를 다운로드하고 미리 설치해둔 MongoDB와도 연동하는 것을 해보았으니 이제 아주 기초적인 select연산을 해보려 한다. 지난번 DB에 test 문서로 DB에 insert했던 문서는 아래와 같다.

{
   "name" : "MongoDB",
   "type" : "database",
   "count" : 1,
   "info" : {
               x : 203,
               y : 102
             }
}


위와 같은 형태의 JSON문서를 DB에 insert하였는데, 일부러 여러건의 데이터를 조회해보기 위해 동일한 문서를 미리 여러번 mongoDB에 삽입해두었다. 이제 이러한 문서를 간단하게 SELECT하는 방법을 살펴보자.


1. findOne()
DBObject myDoc = coll.findOne();
System.out.println(myDoc);

findOne 메소드의 경우 해당 DB의 첫번째 레코드만을 리턴해주는 메소드로 가장 먼저 입력된 레코드가 리턴되는 형태이다. 아마 생각보다 사용할 일은 없을 듯 하긴 한데, findOne()의 경우 여러 형태로 overloading되어 있으므로 어떠한 조건을 같이 사용하냐에 따라 유용하게 사용할 수 있을 듯 하다.


2. find()
 DBCursor cur = coll.find();

 while(cur.hasNext()) {
     System.out.println(cur.next());
 }
find의 경우 findOne과 다르게 주어진 조건에 해당하는 모든 결과를 리턴해주는 메소드로 RDBMS에서 주로 사용하는 SELECT 쿼리의 형태와 동일한 메소드라고 보면 될 것 같다. 


3. find() 메소드에 조건 추가하기
        BasicDBObject query = new BasicDBObject();

        query.put("name", "MongoDB");
cur = coll.find(query); while(cur.hasNext()) { System.out.println(cur.next()); }

mongoDB에서도 위와 같이 SELECT연산시 조건을 추가해줄 수 있는데 이를 Java 코드에서 사용하기 위해선 BasicDBObject라는 객체를 생성하여 이를 find메소드에 parameter로 넘겨주어야 한다. 특히 여러개의 조건인자를 주어야하는 경우 가령 예를 들어 a=100 AND b=50과 같은 여러개의 조건을 부가적으로 추가해주어야 하는 경우도 BasicDBObject객체를 생성하여 넘겨주어야하는 구조와 동일한 구조이지만 다음과 같이 사용법이 살짝 다르다.

 query.put("info", new BasicDBObject("x", 203).append("y", 102));	

위와 같이 BasicDBObject객체의 append메소드를 이용하여 추가적인 조건들을 덧붙인 뒤 BasicDBObject 객체를 parameter로 넘겨주면 된다.


4. JSON문서의 Subelement 조회하기

보통 JSON문서의 경우 위의 예제에서의 "info"처럼 하나의 Depth가 더 내려간 형태의 Subelement가 존재하기 마련이다. 만약 find()메소드를 이용하여 적합한 조건의 문서를 찾고자 할때, 우리가 주고자 하는 조건이 Subelement의 값들만을 사용해야 한다면 어떻게 해야할까? 위에서 처럼 단순히 append를 이용해서 하면 되지 않을까? 물론 바로 아래 예제처럼 info가 가지고있는 element인 x와 y의 값에 조건을 주고 찾으면 된다. 

 query.put("info", new BasicDBObject("x", 203).append("y", 102));	

하지만 이 방법에는 치명적인 단점이 있는데, 만약 난 y필드의 값은 고려하지 않고 오로지 info안에 있는 x 필드의 값으로만 조건을 주고 검색하고 싶다면 이 방법으로는 원하는 결과값을 얻을 수 없게 되어있다. 그럼 이러한 경우에는 어떻게 해야할까? 아직은 많은 조건들을 직접 사용해보지도 않았기에 첨엔 그저 BasicDBObject의 append를 사용하여 해결해보고자 이리저리 시도해보았지만 y필드의 값도 명시해주지 않는 이상 원하는 결과를 얻을 수가 없었다. 그러다 해결책을 우연찮게 찾게되었는데 아주 생각보다 간단한 방법으로 이를 해결할 수 있었다.

 query.put("info.x", 203);	

위에서 보는 것과 같이 아주 단순했다. 그냥 조건 필드명을 명시해줄때 info아래의 x 필드를 저렇게 명시해주고 찾고자하는 조건의 값을 단순히 저렇게 셋팅만 해주면 간단히 해결할 수 있었다. 


아직은 mongoDB를 기초적인 수준으로 이용만 하고 있는데, 더욱 다양한 목적과 기능을 위해 사용하기 위해서는 더 많은 것들이 필요하다. 그러기 위해 mongoDB는 다양한 조건을 원활하게 사용하기 위해 이미 많은 기능들을 제공하고 있다(AND, OR조건에서 부터 MapReduce까지). 여기에서 언급하지 않은 다른 기능들은 그냥 읽어보면 금새 알 수 있는 내용이기에 포스팅하지는 않았으니, mongoDB에서 제공하는 Java Tutorial 페이지에가서 작접 읽어보시길 바란다. 그리고 이번 포스팅에서 예제로 보여주었던 코드들의 전체 코드를 첨부하니 필요하신 분들께서는 다운로드 받아 살펴보시길..


저작자 표시 비영리 변경 금지

'Programming > NoSQL' 카테고리의 다른 글

MongoDB 성능 테스팅  (2) 2010/11/02
MongoDB Java Driver에서 IN Query사용하기  (0) 2010/11/02
MongoDB Select 예제  (0) 2010/10/26
NoSQL 관련 문서  (0) 2010/10/26
MongoDB Java에서 Connection하기  (0) 2010/10/18
MongoDB 설치하기  (0) 2010/10/18
Posted by Jason Park
이전버튼 1 ... 38 39 40 41 42 43 44 45 46 ... 119 이전버튼