MongoDB Document 인출하기, db.collection.find() (1)

MongoDB에서 데이터를 인출 질의는 find() 입니다. MySql의 Select에 해당하는 질의 입니다. MongoDB의 질의는 기본적으로 Javascript 함수나 메서드를 호출하는 방법과 유사합니다. MySql과 마찬가지로 현재 사용할 DB를 선택한 상태(use dbname)라는 가정하에 진행하겠습니다. find()의 기본 문법은 아래와 같습니다.

db.collection.find()

collection(MySql의 Table에 해당) 부분에는 document가 저장된 collection명이 들어갑니다. MySql의 쿼리문으로 치환하면, “SELECT * FROM <Table name>”에 해당합니다.  또한 find()는 두 개의 인자를 받아서 조건을 부여할 수 있습니다.

db.collection.find( array(), array() )

find()의 인자는 모두 배열 형식으로 받으며 이는 대다수의 MongoDB 질의문에도 해당합니다. 첫번째 배열에는 MySql의 WHERE 절에 해당하는 조건문을 설정하고, 두번째 배열에는 불러올 Field값(Column명)을 설정합니다. 조건문(논리연산자, 비교연산자 등)은 그 자체로 내용이 거지같이 꽤나 많이 때문에 간단한 연산만 다루도록 하겠습니다. 조건 부여는 다음과 같은 형식으로 이루어 집니다.

db.collection.find( { 'field' : 'value' } )

위 질의를 MySql로 치환하면 “SELECT * FROM <Table name> WHERE field = value”가 됩니다. 여기에 불러올 Field명을 지정하는 두번째 인자는 다음과 같이 부여합니다.

db.collection.find( { 'field' : 'value' }, 
                    { 'name' : 1, 'age' : 1 } );

위 질의를 Mysql로 치환하면 “SELECT name, age FROM <Table name> WHERE field = value”가 됩니다. ‘name’과 ‘age’ 뒤의 1은 MongoDB에서 true 대신 쓰이며 반대로 false의 경우에는 0 이 쓰입니다. 따라서 위의 질의문에서 ‘name’과 ‘age’의 값을 0으로 바꾸면 두 필드를 제외한 전체 document가 반환됩니다.
다시 첫 번째 인자인 where 절로 돌아가서 비교 연산자를 적용해 보도록 하겠습니다. MongoDB의 비교연산자는 $lt, $lte, $gt, $gte, $in, $nin, $ne 이 있습니다. MySql과 달리 기호가 아니라 헷갈립니다만 의미를 정리하면 다음과 같습니다.

연산자 영문 뜻 풀이
$lt less than 작은
$lte less than or equal to 작거나 같은
$gt greater than
$gte greater than or equal to 크거나 같은
$in exist in 존재하는
$nin not exist in 존재하지 않는
$ne not equal to 같지 않은

비교 연산자의 적용은 다음과 같습니다.

db.collection.find( { 'age' : { '$gt' : 10 } )

위 질의를 MySql로 치환하면 “SELECT * FROM <Table name> WHERE age > 10″이 됩니다. 여러 조건을 부여하기 위해서는 콤마로 계속 이어나가면 됩니다.

db.collection.find( { 'age' : { '$gt' : 10 }, 
                      'age' : { '$lt' : 20 }, 
                      'gender' : 'male' } )

MySql 로는 “SELECT * FROM <Table name> WHERE age > 10 AND age < 20 AND gender = ‘male'” 이 됩니다. 참고로 MongoDB에서는 조건을 콤마로 이어나갈 경우 AND 연산으로 간주합니다. 그 외의 논리 연산은 다음에 다루도록 하겠습니다.
한가지 주의하실 사항은 조건문에는 싱글쿼트 ‘ (따옴표)나 더블쿼트 “(쌍따옴표)를 모두 쓰셔도 상관 없습니다만 더블쿼트를 사용하실 경우 연산자인 $앞에 \(역슬래쉬)를 붙여줘야 하기 때문에 가급적이면 싱글쿼트를 사용하는 것을 권장합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>