시작하며
금번 회사에서 진행하는 신규 프로젝트에서 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})
- 위와 같이 사용하면, 아래 두가지 경우가 모두 다 조회된다.
- age 필드가 아예 없는 경우
- 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 |