쿼리(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판
'컴퓨터 > database' 카테고리의 다른 글
[MongoDB] 몽고DB 후다닥 시작하기 - 6 (집계 프레임워크) (0) | 2022.07.10 |
---|---|
[MongoDB] 몽고DB 후다닥 시작하기 - 4 (인덱스) (0) | 2022.06.27 |
[MongoDB] 몽고DB 후다닥 시작하기 - 2 (0) | 2022.06.26 |
[MongoDB] 몽고DB 후다닥 시작하기 - 1 (0) | 2022.06.24 |
데이터베이스 암기 노트 (0) | 2020.10.06 |