AOC55

Backend, Devops, Cloud, kubernetes

BackEnd/MongoDB

MongoDB :: Query 사용법

aoc55.soft@gmail.com 2022. 10. 22. 17:56

시작하며

금번 회사에서 진행하는 신규 프로젝트에서 MongoDB를 사용함에 따라서, MongoDB 학습중에 정리한 사항을 남겨봅니다.

모든 내용의 기반은 아래 문헌을 참고하였습니다. 또한 아래 글의 내용 중에 틀린 내용이 있을 수 있습니다.

 

참고문헌

몽고DB 완벽가이드  | 한빛미디어 

https://product.kyobobook.co.kr/detail/S000001810370

 


 

기본 쿼리

기본적으로 MongoDB에서 Document 검색은 아래와 같이 수행하게 된다. 

db.find({검색조건}, {조회옵션})
db.findOne({검색조건}, {조회옵션})
  • 이때 검색 시 다양한 조건 및 옵션에 대해 알아보겠다.

 

검색 시 리턴 받을 키 지정

  • 첫번째 파라미터로 검색조건을 지정한 후, 두번째 파라미터로 조회 결과로 리턴 받을 키에 대해서 지정한다.
  • (생략 시 Document의 모든 Key가 리턴된다)
  • 이때, 두번째 파라미터로 지정한 키 외에도 _id는 항상 리턴된다.
db.student.findOne({"name":"zzz"}, {"age" : 1})
  • 위 예시는 name은 zzz인 → Document의 age를 리턴해달라는 예시이다. (_id 자동 포함)

 

검색 시 제외할 키 지정

  • 위와 반대로 제외할 키에 대해서 두번째 파라미터로 지정 가능하다.
  • 제외할 키에 대해서 value를 0으로 설정해준다.
db.student.findOne({"name":"zzz"}, {"age" : 0})

 

조건절

  • 첫번째 파라미터 검색조건에 대해서 아래와 같은 다양한 조건을 사용할 수 있다.
    • $lt : 작음
    • $lte : 작거나 같음
    • $gt : 큼
    • $gte : 크거나 같음
    • $ne : 같지 않음
// 예시
db.student.findOne({"age": {"$gt" : 10, "$lt": 50}})
  • age가 10보다 크고, 50보다 작은 Docuemnt 조회

 

OR 검색

  • MongoDB에서 검색조건을 나열할 경우 기본적으로 AND 검색을 수행하게 된다.
  • 이때 OR 검색을 하는법에 대해서는 아래와 같다.

 

OR 검색 구현1 ($in)

  • 하나의 Key에 일치 시킬 Value가 여러 개 인 경우 사용한다.
  • 단, 하나의 key에 각 요소가 서로 다른 데이터 형이여도 가능하다. (ex. [정수, 문자, 정수, 정수])
  • 반대로 Not In도 ($nin)으로 가능하다.
db.student.findOne({"age": {"$in" : [10, 20, 40]}})

 

OR 검색 구현2 ($or)

  • 조건 대상이 되는 Key 자체가 여러개 일 경우 사용한다.
  • find에서 $or 연산자를 사용한다.
  • 그리고 연산자 대상인 배열 내에 검색 조건(OR 조건)이 되는 필터들을 세팅한다.
  • 조건 설정 시 OR 쿼리에서 첫번째 필터로 가능한 일치하는 많은 Document 를 찾아낼 수록 효과적이다.
db.student.find({"$or": [{"name" : "aaa"}, {"age": 20}]})

 

null 인 대상 찾기

  • 주의사항으로 key가 있는 경우에서 값이 null인 경우와, key 자체가 없는 경우는 다르다.
db.student.find({"age" : null})
  • 위와 같이 사용하면, 아래 두가지 경우가 모두 다 조회된다.
  1. age 필드가 아예 없는 경우
  2. age 필드가 있지만 값이 null 인 경우

 

db.student.find({"age" : {"$eq": null, "$exists": true}})
  • 위와 같이 사용하면 Key는 있지만, 확실히 해당 Value가 null인 경우만 조회한다.
  • 값이 null 인지 $eq 연산자를 통해 확인하고 → 다음으로 값이 null 인지 $eq 연산자를 통해 확인한다.

 

배열 대상의 쿼리

  • 배열 내 요소에 대한 쿼리는 기본적으로 스칼라 쿼리와 같은 방식으로 동작하도록 설계되어 있다.

 

배열 내 요소 일치여부

  • 스칼라 검색이랑 동일한 문법이다.
db.student.find({"hobby" : "book"})
  • Docuemnt 중에 hobby 이라는 Key에 들어있는 배열의 요소 중에 값이 “book” 이 있는 경우 검색.

 

배열 내 요소 일치여부 (복수) ($all)

  • 배열 내 요소에 대해서 일치해야 하는 Value가 복수 일 경우
  • 일치하는 순서는 중요하지 않다.
db.student.find({"hobby" : {"$all": ["football", "music"]}})
  • 위 예시는 hobby 가 가지고 있는 배열의 요소중에 “football”과 “music”이 모두 있는 Docuemnt 찾기를 뜻한다.

 

배열 내 특정 인덱스 요소에 조건 설정 (배열.index)

db.student.find({"hobby.1" : "football"})
  • hobby 배열의 1번째 인덱스가 football 인 경우로 조건 설정.
  • (참고로 배열의 인덱스는 0부터 시작)

 

배열의 Size로 조건 설정 ($size)

  • 배열의 크기를 조건으로 쿼리하기
db.student.find({"hobby" : {"$size": 3}})

 

배열의 부분집합 반환받기 ($slice)

  • 두번째 매개변수에 반환받을 배열 지정 시 $slice 연산자를 통해서 배열의 부분집합 설정이 가능하다.
db.student.find({}, {"hobby": {"$slice" : 2}}) // 0~1 Slicing
db.student.find({}, {"hobby": {"$slice" : [0,2]}}) // 0~1 Slicing

 

내장 도큐먼트에 쿼리하기

내장 Document 예시

{
  "_id": {
    "$oid": "63500c360986253b2e81b00a"
  },
  "name": "alex",
  "hobby": [
    "baseball",
    "football",
    "book"
  ],
  "grade": {
    "math": 80,
    "english": 50,
    "korean": 100
  }
}
  • 위의 “grade” 필드에 내장 Document 가 있는 것을 알 수 있음.

 

내장 Docuemnt의 Key로 조건 설정하기

  • 검색 조건에 내장 Document의 필드를 dot 표기법을 통해서 지정하면 됨
db.student.find({"grade.korean" : {"$gt" : 80}})
  • 내장 Document 인 grade 에서 korean 필드에 대해서 쿼리 조건 설정

 

그 외 조회 시 옵션

조회 개수 제한 (limit)

db.student.find().limit(1)
  • 조회 개수를 제한한다.

 

조회 시 skip

db.student.find().skip(1)
  • 조회 시 Skip 할 Document 수를 설정한다.
  • 그러나 Skip 해야 되는 대상이 많을 경우 MongoDB 원리상으로는 비효율적이다.

 

조회 시 정렬

db.student.find().sort({"name": 1})
  • 조회 결과에 대해서 정렬이 가능하다.

 

조회 시 옵션 복합 사용예시

db.student.find().limit(10).skip(20).sort({"name": 1})

'BackEnd > MongoDB' 카테고리의 다른 글

MongoDB :: 배열 연산자 사용법  (0) 2022.10.12
MongoDB :: 기본 CRUD 사용법  (1) 2022.10.10