본문 바로가기
IT/MongoDB

[11일차] Studio 3T for MongoDB

by GWLEE 2022. 7. 4.

2022.07.04

Studio 3T for MongoDB

 

Upsert 있으면 업데이트 없으면 insert

내부적으로 upsert를 제공한다.

 

 

$inc 연산자는 이미 존재하는 키의 값을 변경하거나 새 키를 생성하는 데 사용한다.

분석, 분위기, 투표 등과 같이 자주 변하는 수치 값을 갱신하는 데 매우 유용하다.

 

 

3이 나올 것 같지만,, 28이 나온다.

이유는? 동작 메커니즘이 있다.

upsert니깐 없으니 추가하고 있으니 업데이트해주는 

 

rep가 25인 새로운 도큐먼트를 만들고 3만큼 증가시켜 rep는 28이 된다.

갱신 입력을 지정하지 않으면 {"rep" : 25}는 어떤 도큐먼트와도 일치하지 않으며 25일도 발생하지 않는다.

 

 

 

 

똑같이 들어가는 거 확인

gift 필드 추가해서 삽입한 도큐먼트 세개에 각각 gift 필드가 추가되는 걸 알 수 있다.

조건에 맞는 도큐먼트를 모두 수정하려면 updateMany를 사용한다.

 

find에다가 옵션을 줄 수 있는데

projection / collection

 

 

키의 값만 원할 때 

 

projection 뭘 빼고 나와라 뭐만 출력해라 라는 의미

특정한 키/ 값 쌍을 제외한 결과를 얻을 수 있다. 

필요없는 건 제외시킨다. "_id" 반환을 제외

 

 

조건연산자 

gte는 >= 이다. 

 

age가 18이상 30이하인 document를 모두 찾아낸다.

slack 에서 받은 조건연산자 표

 

조건 반대라서 하나도 안나온다

 

not은 메타조건절이며 어떤 조건에도 적용할 수 있다. 

두개의 차이를 기억해두도록 하자 ,, 없으니깐 없는 값을 제외한 나머지가 다 나오게 된다.

값이 null인 키만 찾고 싶으면 null 이 값을 쿼리하고 , $exists 조건절을 사용해 null 존재 여부를 확인하면 된다.

y는 null 값이 있어서 나오고 x는 없어서 나오지 않는다.

 

배열로 주면 정확하게 일치해야 나온다.

 

순서가 바뀌면 다른거라 나오지 않는다.

- apple 과 banana가 들어있는 모든 배열이 다 튀어나온다.

- fruit에 index 2번이 peach인 배열 찾기

 

- size 특정 크기의 배열을 쿼리하는 유용한 조건절

	5) $slice
	
	find 의 두번째 인자는 반환값에 대한 것
	"$slice" 는 반환되는 배열의 subset을 얻게 한다.
	
	배열의 처음 10개 항목 추출(-10 : 마지막 10개)
	db.blog.posts.findOne(조건, {"comments" : {"$slice" : 10}})
	
	처음 23개 항목 건너뛰고 24번째 부터 10개
       db.blog.posts.findOne(조건, {"comments" : {"$slice" : [23, 10]}})

 

 

마지막만 배열

 

 

특정한 스칼라값과 배열 혼용하는 건 아예 안하는 게 좋다.

a) 먼저 10 보다 큰 값을 가진 도큐먼트를 찾는다. ==> {"x" : 15}, {"x" : 25}, {"x" : [5, 25]}
b) 이 결과에서 20보다 작은 값을 가진 도큐먼트를 선택한다. ==> {"x" : 15}, {"x" : [5, 25]}
 즉, {"x" : [5, 25]} 값은 각 항목으로 위 두 조건을 모두 만족하기 때문에 선택된다.

내장 도큐먼트 쿼리하기

 

- 배열로 비교할 때에는 elematch를 쓴다. 내장 도큐먼트에서 2개 이상의 키의 조건일치 여부를 확인할 때만 필요하다.

 

- 새로운 값 insert

$where 쿼리

where라는게 있는데 where안에 javascript 소스코드를 사용할 수 있고

보안상의 이유로 못쓰게 막아둔다. 코드의 의미는 몰라도 된다.

 

1) Limits, Skips, Sorts
3개의 결과만 반환
> db.c.find().limit(3)
.
처음 3개의 결과를 스킵하고 나머지 반환, 결과가 3개 이하면 아무것도 반환되지 않는다.
> db.c.find().skip(3)
** 
일반적으로 작은 양의 skip을 사용하는 것은 문제가 없다. 
그러나 대량 skip을 사용하게 되면 일단 모든 skip할 도큐먼트를 find 한 후
skip을 수행하기 때문에 전체적으로 성능이 느려진다.
그러므로, 대량의 skip은 피해야 한다.
	
username으로 ascending, age로 descending
> db.c.find().sort({username : 1, age : -1})
	
쇼핑몰에서 TV를 높은 가격순으로 50개 검색
> db.stock.find({"desc" : "TV"}).limit(50).sort({"price" : -1})

 


CH7 집계 프레임워크 P.223

- 1개이상의 STAGE 생성 각 STAGE를 거치면서 단계를 생성 

각 STAGE -> STAGE 올라가는게 파이프라인 구조

 

일치 match , 선출 projection , 정렬 sort, 건너뛰기 skip, 제한 limit

aggregate는 집계 쿼리를 실행할 때 호출하는 메서드

집계를 위해 집계 파이프라인을 전달하는데, 파이프라인은 도큐먼트를 요소로 포함하는 배열

match 단계에서는 컬렉션에 대해 필터링하고 결과 도큐먼트를 한 번에 하나씩 선출 단계로 전달한다.

선출 단계는 작업을 수행하고 도큐먼트 모양을 변경 후 출력을 파이프라인에서 다시 우리에게 전달한다.

 

 

 

터미널에서 사용하기!

sample_db 사용하는 거 확인

documents 433개 확인

 

 

데이터 살펴보기 데이터 구조 파악..

_id 필드는 제외하고 나머지 조건 출력

10개의 도큐먼트를 건너뛰고(skip)  출력

unwind  집계 파이프라인에서 배열 필드로 작업할 때는 종종 하나 이상의 전개단계를 포함해야한다.

이를 통해 지정된 배열 필드의 각 요소에 대해 출력 도큐먼트가 하나씩 있는 출력을 생성할 수 있다.

 

배열 표현식 // 선출 단계에서 배열 표현식을 사용하는 방법

1. 필터 표현식

필터 기준에 따라 배열에서 요소의 부분집합을 선택한다.

$filter 연산자는 배열 필드와 함께 작동하도록 설계됐으며 우리가 제공하는 옵션을 지정한다.

 

$filter의 첫 번째 옵션은 input이며 단순히 배열을 지정한다.

 

$$는 작업중인 표현식 내에서 정의된 변수를 참조하는데 사용

as 절은 필터 표현식 내에서 변수를 정의한다.

이 때 변수는 as 절에서 레이블링한 대로 good라는 의미를 가진다.

 

 

project가 마지막 항목일거라는 고정관념을 버려라

praise항목에 0번째인거 출력하기

리소스가 많이 소요되므로 권장하지 않음

44개인 것을 확인할 수 있다.

이미 들어있는 데이터가 최신이 마지막으로 정렬되어 있어서 

출력할때 0이 가장 최근이고

-1이 가장 마지막이다.

db.restaurants.findOne() 에서 확인가능

 

 

그룹화

document _id와 다르다. 그룹핑의 _id는 그룹핑을 무엇을 할 지 정해준다.

 

이렇게 출력된다.

 

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

[12일차] MongoDB 정리본  (0) 2022.07.05
[12일차] MongoDB  (0) 2022.07.05
[11일차] MongoDB 정리본  (0) 2022.07.04
[10일차] MongoDB 정리본  (0) 2022.07.01
[10일차] MongoDB  (0) 2022.07.01

댓글