컴퓨터/database

[MongoDB] 몽고DB 후다닥 시작하기 - 3

김크리 2022. 6. 26. 21:38

쿼리(Query)

find

 - find는 첫 매개변수에 따라 어떠한 도큐먼트를 가져올지 결정한다.

 - 쿼리 도큐먼트에 여러 키/값 쌍을 추가하여 검색을 제한할 수 있다.

 - 반환 받을 키 값을 지정하여 받을 수 있다.

  - "_id" 값은 지정하지 않아도 항상 반환된다.

# 조회
> db.${컬렉션 명}.find()

# 특정 키 값만 조회
> db.${컬렉션 명}.find({},{${조회하고자 하는 키 값} : 1});

# 특정 키 값을 제외하고 조회
> db.${컬렉션 명}.find({},{${조회하고자 하는 키 값} : 0});

- 쿼리 도큐먼트의 값은 반드시 상수이어야한다.

- 쿼리는 완전 일치(exact match) 외에도 범위, OR절, 부정 조건 등 복잡한 조건을 사용할 수 있다.

- 비교연산자로 $lt, $lte, $gt, $gte, $ne 를 사용할 수 있다.

  - $lt : least than, 미만

  - $lte : least than equals, 이하

  - $gt : greatest than, 초과

  - $gte : greatest than equals, 이상

  - $ne : not equals, 같지 않은

# 조건절을 활용하기
# 조건 키값이 2보다 크거나 같은 경우를 필터링 한다.
> db.${컬렉션명}.find({${조건이 필요한 키값} : {"$gte":2}})

- OR 쿼리 방식으로는 "$in"을 사용하거나 "$or"을 사용하는 두가지의 방식이 있다.

  - $in에 파생된 $nin 또한 있다. 일반적인 RDBMS의 in, not in, or과 사용방법이 동일하다

  - $or 연산자는 가능한 조건들의 배열을 취한다. 또한 다른 조건절을 취할 수 있다. 

  - $or 연산자가 동작하는 동안에는 $in, $nin을 사용하는 것이 쿼리 옵티마이저에 효율적이다.

- $not 조건절은 메타 조건절이며 어떠한 조건에서도 적용할 수 있다.

- $mod 연산자는 나머지 연산을 한다.

- 몽고DB의 도큐먼트는 다양한 데이터 형을 사용할 수 있다. 이러한 상황에서 일부 데이터형은 쿼리 시 형에 특정하게 작동한다.

  - null은 스스로와 일치하는 것을 찾는다. 키의 값에 null을 갖고있는 것, 그리고 해당 필드를 가지고 있지 않는 도큐먼트도 반환한다.

  - 값이 null인 키만 찾고 싶다면, null을 쿼리하고 $exists 조건절을 사용하여 null의 존재여부를 확인한다.

# 임시 값을 넣는다
> db.c.insertMany([{"title":"title1","y":1},{"title":"title2","y":2},{"title":"title3","y":null},{"title":"title4"}])

# null을 찾는다
# y 키 값에 null이 있거나 해당 키가 없는 데이터가 필터된다.
# 예시는 title3, title4가 출력된다.
> db.c.find({"y":{"$eq":null}})

# null을 y키 값으로 갖는 데이터를 찾는다. 키가 없는 값은 찾지 않는다.
> db.c.find({"y":{"$eq":null, "$exists":true}})

- $regex 연산자를 사용하여 정규 표현식을 사용할 수 있다.

 

- 배열 요소 쿼리는 스칼라 쿼리와 같은 방식으로 동작한다. 

- $all 연산자를 통해 2개 이상의 배열 요소가 일치하는 배열을 찾을 수 있다.

- $size 연산자를 사용하여 특정 크기의 배열을 쿼리할 수 있다.

- $slice 연산자를 사용하여 배열 요소의 부분 집합을 반환 받을 수 있다.

# 배열 쿼리
# 배열 값 {"키 값" : ["A","B","C"]}
> db.${컬렉션 명}.find({${키 값} : "A"})

# $all연산자를 통해 두개 이상의 배열요소 일치 확인
# 배열 값1 {"키 값" : ["A","B","C"]}
# 배열 값2 {"키 값" : ["A","C"]}
# 배열 값3 {"키 값" : ["A","B"]}
# 배열 값4 {"키 값" : ["B"]}
# 배열 값 1 과 2만 반환
> db.${컬렉션 명}.find({${키 값} : {$all:["A","C"]}})

# 배열의 사이즈로 조회
> db.${컬렉션 명}.find({${키 값} : {$size:3}})

# 배열의 부분집합 반환
# 가장 앞의(순차적) 2개 값만 반환한다.
# 역으로 할 경우 음수로 $slice 에 조건을 걸면 된다.
> db.${컬렉션 명}.find({${키 값}:"A"}, {${키 값} : {$slice:2}})

- 내장 도큐먼트에 쿼리를 할 수 있다. 내장 도큐먼트는 점 표기법(dot notation)을 사용하여 키를 쿼리한다.

- $where을 사용하여 임의의 자바스크립트를 쿼리의 일부분으로 실행 할 수 있다. 해당 절은 도큐먼트 내의 두 키를 비교하는 쿼리에 자주 사용한다.

  - 몽고DB 3.6부터는 쿼리 언어로 집계 표현식을 자유롭게 쓸 수 있도록 $expr 연산자가 추가되었다. 해당 연산자를 사용하면 자바스크립트를 실행하지 않아 더 빠르게 쿼리할 수 있다.

  - $where 절은 객체의 변환이 있어 일반 쿼리보다 현저히 느리다. 최선의 방안이 없을 경우 사용한다.

# $where 쿼리
> db.${컬렉션 명}.find({"$where": function(){
        if(조건절){
        	return true
        }
	return false;
	}
   })

- 데이터베이스는 커서를 사용하여 find의 결과를 반환한다. 결과 개수를 제한하거나, 건너뛰기, 키 조합든 다양한 방면으로 사용된다.

  - limit, skip, sort 등을 사용하여 제한/건너뛰기/정렬을 할 수 있다.

  - skip의 경우, 도큐먼트의 수가 적다면 무리가 없지만 skip 연산자는 인덱스를 효율적으로 활용하는 지원이 없으므로 속도 저하에 원인이 될 수 있다. 데이터가 많은 경우 지양해야한다.

# 쿼리 제한 옵션
# 결과 개수 제한
db.c.find().limit(n)

# 쿼리 제한 옵션 - 2
# 처음 n 개를 건너 뛴 나머지를 반환한다.
db.c.find().skip(n)

# 쿼리 정렬 옵션
# 정렬 방향은 1: 오름차순, 0:내림차순 이다.
db.c.find().sort({${키 값}:1})

- 몽고DB에서는 데이터 형을 비교하는 위계구조(hierarchy)가 있다.

1. 최솟값

2. null

3. 숫자(int, long, double decimal)

4. 문자열

5. 객체/도큐먼트

6. 배열

7. 이진 데이터

8. 객체 ID

9. 불리언(boolean)

10. 날짜

11. 타임스탬프

12. 정규표현식

13. 최댓값

 

- 몽고DB에서는 커서가 10분동안 활동이 없으면 자동으로 죽는다.

- 그 외의 커서가 자동으로 해제되는 조건이 있으므로 열린 커서로 몽고DB가 문제가 되는 경우는 거의 없다.

- 하지만 immortal이라는 함수로 생성된 커서의 경우, 타임아웃이 없이 계속 남아 서버가 재시작 할 때까지 리소스를 차지한다.

참고

도서 - 몽고DB 완벽 가이드 3판