05. 쿼리 작성하기
#
주요 내용- 전자상거래 데이터 모델 질의
- MongoDB 쿼리 언어 상세
- 쿼리 셀렉터와 옵션
#
조회 쿼리- find vs findOne
- findOne: 도큐먼트 반환
- find: 커서 반환,
limit
과 같이 써야함
- js 셸에서 sort, limit, skip 의 순서는 중요하지 않음
- 조회로 사용하는 필드의 성능을 위해 인덱스를 고려
#
페이지네이션#
특정 필드만 조회#
정규식 조회#
특정 범위#
MongoDB 쿼리 언어 상세#
질의 조건과 셀렉터- 문자열 범위 연산도 가능함
- 범위 연산:
$lt
$lte
$gt
$gte
- 범위 연산:
- 집합 연산
$in
: 지정된 배열 원소 중 하나라도 있는 도큐먼트 검색$all
: 지정된 배열 원소 모두가 있는 도큐먼트 검색$nin
: 지정된 배열 원소 아무것도 없는 도큐먼트 검색 (인덱스 사용 불가)
- 배열
$elemMatch
: 배열내 서브도큐먼트에서 두 개 이상의 속성이 매치되는 것을 찾는 경우$size
: 인덱스 사용 불가
- 자바스크립트 쿼리 연산자(
$where
) 는 인젝션 공격에 취약하므로 주의해서 사용 - 정규표현식 (
$regex
)- prefix 타입 쿼리를 제외하곤 인덱스를 사용할 수 없음
- 대소문자 구별을 무시하는
i
option도 인덱스 사용 불가 - 대부분 선택자보다 실행시간이 오래걸림
#
쿼리 옵션- 프로젝션
- 반환할 필드 선택해서 받을 수 있음
- 옵션
- 1: 포함 필드
- 0: 제외 필드
- 예시
db.products.find({}, {'slug': 1})
: slug 필드만 포함db.products.find({}, {'sku': 0, 'details': 0})
: sku, details 제외한 나머지 필드
$slice
: 배열 필드 슬라이스db.products.find({}, {$slice: 3})
: 처음부터 3개db.products.find({}, {$slice: 3})
: 처음부터 3개db.products.find({}, {$slice: -3})
: 마지막에서 3개
- skip. limit. sort 는 다룸