반응형

이번에는 몽고DB에서 데이터 조회를 해볼 것이다.

find는 RDB(MySQL과 같은...)에서의 SELECT 같은 역할을 한다.

find에도 옵션이 상당히 많기 때문에 여기서는 최소한의 기능을 알아볼 예정이다.

일단 find를 사용하기 전에 임시로 아래와 같이 데이타를 등록해놓았다.

 

db.temps.insert({name: '홍길동', age: 20, gender: '남'});
db.temps.insert({name: '최길동', age: 21, gender: '남'});
db.temps.insert({name: '김길동', age: 22, gender: '여'});
db.temps.insert({name: '윤길동', age: 23, gender: '여'});
db.temps.insert({name: '박길동', age: 24, gender: '남'});
db.temps.insert({name: '고길동', age: 25, gender: '남'});
db.temps.insert({name: '모길동', age: 26, gender: '여'});
db.temps.insert({name: '공길동', age: 27, gender: '남'});
db.temps.insert({name: '구길동', age: 28, gender: '남'});
db.temps.insert({name: '정길동', age: 29, gender: '남'});
db.temps.insert({name: '서길동', age: 30, gender: '남'});

 

위와 같이 데이타 삽입을 하고 아주 간단하게 다음과 같이 조회해볼 수 있다.

 

temps 컬렉션의 모든 항목이 표시된다.

MySQL로 예를 들면 'SELECT * FROM temps' 와 같은 명령과 동일하다고 보면 된다.

그리고 위의 경우 데이타가 깔끔하게 보여지지만 필드가 많아질 수록 제대로 정렬이 안되어서 보기 불편할 수가 있다. 그럴 때는 아래와 같이 find() 뒤에 .pretty()를 붙여주면 다음과 같이 데이터를 더 정리된 형태로 볼 수 있다.

 

이와 같이 잘 정렬되어 보여진다.

이제 다음으로는 기본적인 조건 옵션을 붙여보도록 할 것이다.(MySQL의 WHERE절과 같은)

 

도큐먼트 조회시 조건 걸기

이름이 '김길동'인 사람을 조회해보도록 하겠다.

db.temps.find({name: '김길동'});

위와 같이 단순하다. find() 명령안에 { } 중괄호로 원하는 조건을 감싸주기만 하면 된다.

 

만약 조건을 더 붙이고 싶다면 콤마(,)로 구분하여 뒤에 연결시켜주면 된다.

db.temps.find({name: '김길동', age: 22});

예를 들어, 위와 같은 명령이라면 name이 김길동이고 age가 22인 도큐먼트를 가져오게 된다.

 

도큐먼트 조회시 숫자를 비교하는 조건 걸기

조회할 경우 특정 데이타와 완전히 동일한지만 비교할 수도 있지만, 위의 데이타로 예를 들면 20~25세의 도큐먼트만

가져오는 등의 숫자 비교 조건을 걸 수도 있다.

 

MySQL의 경우 'SELECT * FROM temps WHERE age >= 20 AND age <= 25' 이런 형태로 단순하게 부호를 이용해서

비교가 가능하지만 MongoDB에서는 용법이 조금 다르다.

MongoDB에서는 다음과 같이 사용할 수 있다.

 

db.temps.find({age: {$gte: 20, $lte: 25}});

이와 같이 조건이 적용된 것을 확인할 수 있다.

위 명령을 분석해보면 $gte, $lte 라는 것들을 연산자(operator)라고 한다.

기본적으로 필드가 앞에 있고 필드 뒤에 연산자를 중괄호{}로 감싸서 사용하게 된다.

 

$gte는 greater than or equals이란 의미로 '같거나 크면'이라는 조건의 의미를 갖는다.

$lte는 less than or equals이란 의미로 '같거나 작으면'이라는 조건의 의미를 갖는다.

이외에 다양한 연산자가 존재한다.

 

$gt : 주어진 값보다 큰 경우

$lt : 주어진 값보다 작은 경우

$eq : 주어진 값과 일치하는 경우

$ne : 주어진 값과 일치하지 않는 경우

$in : 주어진 배열 안에 속하는 값

$nin : 주어진 배열 안에 속하지 않는 값

 

위는 비교 연산자이고, 그 외에 논리 연산자, 문자열 연산자 등 다양한 연산자가 따로 존재한다. 

그것은 각 연산자 사용시에 다시 알아보도록 하겠다.

 

도큐먼트 조회시 정렬하기

가져온 데이타들을 소팅할 수 있는 방법을 알아볼 것이다.

위에서 insert한 데이타들을 기준으로 age 필드의 데이타를 내림차순으로 정렬해보려 한다.

db.temps.find().sort({age: -1});

아주 간단하게 정렬이 되었다.

find()뒤에 sort()명령을 붙여줄 수 있고 중괄호 안에 원하는 정렬 기준을 지정해주면 된다.

age: -1는 age 필드를 내림차순으로 정렬한다는 의미이다.

-1은 내림차순이지만 오름차순으로 정렬하고 싶다면 {age: 1}과 같은 형태로 사용하면 된다.

이 때 .sort() 명령 뒤에 .pretty()를 붙여서 더 정리된 형태로 표시할 수도 있다.

 

도큐먼트 조회시 특정 개수만 표시하기, 특정 위치의 데이타 가져오기

데이타 수량이 너무 많거나 페이지네이션 구현 등을 위해 특정 개수만 표시하고 싶을 때가 있다.

이 때는 .limit()이라는 명령을 사용할 수 있다.

 

db.temps.find().limit(1);

이와 같이 가져올 데이타의 상위 1개의 데이타만 가져오게 된다.

페이지네이션 구현을 위해 많이 사용하게 된다. 페이지네이션 구현시에는 특정 개수만 가져오는 것도 필요하지만,

특정 위치의 도큐먼트를 가져오는 것도 필요하다.

이 때는 .skip()이라는 명령을 사용할 수 있다.

 

db.temps.find().skip(2).limit(2);

조회할 데이타의 2개 뒤의 데이타들 중 2개만 가져오는 명령이다.

이를 통해서 페이지네이션을 구현할 수 있다.

 

여기까지 find의 기본적인 내용들을 다루어보았고, 다음에는 여기서 설명하지 않았던 다른 연산자들에 대해서도

알아보려 한다.

반응형

+ Recent posts