05. 쿼리 작성하기

주요 내용#

  • 전자상거래 데이터 모델 질의
  • MongoDB 쿼리 언어 상세
  • 쿼리 셀렉터와 옵션

조회 쿼리#

  • find vs findOne
    • findOne: 도큐먼트 반환
    • find: 커서 반환, limit 과 같이 써야함
  • js 셸에서 sort, limit, skip 의 순서는 중요하지 않음
  • 조회로 사용하는 필드의 성능을 위해 인덱스를 고려

페이지네이션#

page_number = 1
page_size = 10
category = db.categories.findOne({'slug': 'gardening-tools'})
products = db.products.find({'category_id': category['_id']})
.sort({'helpful_votes': -1})
.skip((page_number - 1) * page_size)
.limit(page_size)

특정 필드만 조회#

db.users.findOne(
{
'username': 'kbanker',
'hashed_password': ''
},
{
'_id': 1
}
)

정규식 조회#

db.users.find({'last_name': /^Ba/})

특정 범위#

db.users.find({'addresses.zip': {'$gt': 10019, '$lt': 10040}})

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 는 다룸
Last updated on