쿼리
배열
- find() 할 때 문서의 키에 대응하는 value 값에 쿼리문안에 요청한 값이 있으면 출력한다.
- $all 연산자는 2개 이상의 배열 요소가 일치하는 배열을 찾을 때 사용한다.
- 순서는 중요하지 않아 조회하는 "type" 키의 배열 값이 ["banana","apple" ~] , ["apple", "banana" ~ ] 모두 조회가 가능하다
- 전체 배열과 일치하는 문서를 조회할 경우 모든 요소의 인덱스 순번에 해당하는 배열내 요소의 값을 작성해서 정확히 일치하여야 함
- 배열 내의 특정 요소를 조회하기 위해선 "key:index" 구문을 이용하여 순서를 지정한다.
- "type" 키의 값에 "세 번째" 인덱스에 위치한 값을 조회
- 배열의 인덱스는 0부터 시작하기 때문에 2로 입력
- $size 연산자는 특정 크기의 배열을 쿼리할 수 있다.
- $slice 연산자는 배열 요소의 부분집합을 반환
- 즉, 배열로 이루어진 필드가 10개 있다면, 그중 필요한 부분만 반환할 수 있음
- details 키의 값은 내장 문서가 있고, 내장 문서 안에는 colors 키와 sizes키에 해당하는 각 배열의 값들이 존재
- $slice : 2를 통해 details.sizes 키에 해당하는 배열의 값 중 인덱스가 0부터 시작하는 2개의 값들을 반환
- $slice : [2,3] 을 통해 처음 2개는 건너뛰고, 3번째 요소부터 3개를 반환해라
- $slice : -2 를 통해 끝 부분 2개를 반환
- $where
- $where 연산자는 JavaScript의 표현 또는 JavaScript 함수 전체를 쿼리에 전달할 수 있음
- 아래 예제는 this 키워드를 이용하여 해당 컬렉션 내의 키를 조회하여 korean == science인 문서를 조회한 것.
- this 키워드 대신 obj 키워드도 사용 가능하다
- $where 주의사항
- $where 쿼리는 일반 쿼리보다 훨씬 느리니 반드시 실행할 경우가 아니면 사용하지 말 것
- $where절을 포함한 쿼리는 각 문서의 BSON에서 JavaScript 객체로 변환되는 과정을 거치기 때문에 느림
- 또한, 인덱스를 사용하는 컬렉션은 $where을 사용할 수 없기 때문에 되도록 사용하지 말 것.
- $where 쿼리는 일반 쿼리보다 훨씬 느리니 반드시 실행할 경우가 아니면 사용하지 말 것
커서
- 데이터베이스는 커서를 사용하여 find() 함수의 결과를 반환
- 데이터베이스 커서는 일련의 데이터에 순차적으로 접근할 때 검색 및 현재 위치를 포함하는 데이터의 한 요소
- count(), pretty(), next() 등이 있음.
- 즉, find() 함수를 사용하면 항상 커서를 반환하고, 커서를 메서드 형식으로 사용하면 검색 결과를 정렬하거나 지정된 건수의 문서를 건너뛰거나 제한하는 등 다양한 기능을 사용할 수 있음.
- collection 이름에 컬렉션에 x 키릐 값이 1부터 100까지 반복하는 반복문을 통해 생성
- var(지역변수)로 cursor 변수를 선언하여 검색 결과를 저장
- 저장한 후 해당 변수에 .next() 기능을 활용하여 0부터 순차적으로 데이터를 검색
- .next()는 현재 커서에서 다음 문서를 반환하는 기능
for(i=0; i<100; i++) { db.collection.insertOne( {x : i} ); }
var cursor = db.collection.find();
- 대표적으로 많이 사용하는 커서 기능은 sort(), limit(), skip() 기능이 있음.
- $limit 함수는 출력되는 결과 중 원하는 개수의 결과만 반환할 수 있다.
- $limit는 상항만 설정되고, 하한은 설정할 수 없음.
- $skip 함수는 출력되는 결과 중 입력한 수치에 따라 처음 수치만큼 건너뛴 나머지의 문서를 반환
- 컬렉션에서 조건에 맞는 결과가 입력한 수치보다 적다면 아무 결과도 반환하지 않음.
- $sort 함수는 정렬을 할 수 있어 정렬하고자 하는 키와 해당하는 고정된 값인 1과 -1을 입력받음
- 1은 오름차순, -1은 내림차순
- 키가 여러개라면 주어진 정렬 방향에 따라 결정
- $sort 함수에서 키가 여러 개라면 주어진 정렬 방향에 따라 결정
- name 키의 값을 오름차순으로 먼저 정렬하고, 동일한 값이 있다면 해당하는 문서 내에서 age 키의 값을 내림차순으로 정렬
db.people.find().sort( { name : 1 , age ; -1} )
- $limit, $skip, $sort 기능을 조합한 쿼리 수행
- 내림차순 된 정렬 값에서 10개만 제한하여 문서 반환
- 내림차순 된 정렬 값에서 5개만 건너뛰고, 10개로 제한하여 출력
- 커서 기능의 순서는 상관 없음.
'Back > MongoDB' 카테고리의 다른 글
MongoDB와 Python 연동하기 (0) | 2023.05.18 |
---|---|
Mongo DB 이론 - 2 (0) | 2023.05.17 |
Mongo DB 실습 - 2 (0) | 2023.05.17 |
Mongo DB 실습 - 1 (0) | 2023.05.17 |
MongoDB 이론 - 1 (0) | 2023.05.17 |