DB/MongoDB

[MongoDB] 도큐먼트 생성,갱신,삭제

프흐프좋아 2024. 2. 24. 02:15

도큐먼트 삽입

- insertOne : 한 개 삽입할 때

db.movies.insertOne({"title" : "Stand By me"})

=> 도큐먼트에 "_id" 키가 추가되고(제공하지 않는 경우) 도큐먼트가 몽고DB에 저장된다.

 

- insertMany : 값을 대량 삽입할 때

db.movies.insertOne(
	{"title" : "Stand By me1"},
    {"title" : "Stand By me2"},
    {"title" : "Stand By me3"}
)

=> insertMany를 사용해서 대량 삽입할 때 배열 중간에 있는 도큐먼트에서 특정 유형의 오류가 발생하는 경우, 정렬 연산을 선택했는지 혹은 비정렬 연산을 건택했는지에 따라 발생하는 상황이 달라진다.

=> 순서가 정해지지 않았다면 정렬된 삽입이 기본값이다.

 

삽입 유효성 검사

- 몽고DB는 삽입된 데이터에 대해 최소한의 검사를 수행한다.

- 도큐먼트의 기본 구조를 검사해 "_id" 필드가 존재하지 않으면 새로 추가하고, 모든 도큐먼트는 16메가바이트보다 작아야하므로 크기를 검사한다. (최대크기는 나중에 커질 수 있다.)

- 도큐먼트가 너무 크지 않은지, UTF-8이 아닌 문자열을 쓰는지 ,인식할 수 없는 데이터형을 포함하는지 등을 확인한다.

 

삽입

- 기존에 몽고DB 3.0 이전에는 몽고DB에 데이터를 넣는 방법이 insert였는데, 이후 버전에서는 CRUD API를 지원한다.

예) insertOne , insertMany => insert도 여전히 지원하지만 , 이 친구들을 지향해서 사용하자

 

도큐먼트 삭제

- CRUD API로는 deleteOne 과 deleteMany를 제공한다.

- 두 메서드 모두 필터 도큐먼트를 첫번째 매개변수로 사용한다. 필터는 도큐먼트를 제거할 때 비교할 일련의 기준을 지정한다.

 

- deleteOne : 한 개 삭제할 때, 만약 필터와 일치하는 도큐먼트가 여러개인 경우 일치하는 첫번째 도큐먼트를 삭제한다. 

db.movies.deleteOne({"_id" : 4 })

 

- deleteMany : 필터에 해당하는 모든 도큐먼트를 삭제할 때

db.movies.deleteMany({"year" : 1998 })

 

drop

db.movies.deleteMany({}) // 전체삭제
또는
db.movies.drop()

 

도큐먼트 갱신

- 갱신은 원자적으로 이뤄진다. 갱신 요청 두개가 동시에 발생하면 서버에 먼저 도착한 요청이 적용된 후 다음 요청이 적용된다.

- 따라서 여러 개의 갱신 요청이 빠르게 발생하더라도 결국 마지막 요청이 최후의 승리자가 되므로 도큐먼트느 변질 없이 안전하게 처리된다.

- 기본 동작을 원치않으면 도큐먼트 버저닝 패턴을 고려하자.

 

도큐먼트 치환

- replaceOne

db.users.replaceOne({"name":"joe"},joe);
// name이 joe인 도큐먼트를 찾아서 joe 데이터로 replace 처리

=> 대대적인 스키마 마이그레이션에 유용하다.

=> 만일 users 컬렉션에 name이 joe 인 도큐먼트가 여러개인 경우에는 에러를 반환한다. 따라서 고유한 도큐먼트를 갱신 대상으로 지정하는 것이 좋다. (보통 _id 를 두번째 인자로 넣으면 효율적임)

 

갱신 연산자

- 일반적으로 도큐먼트의 특정 부분만 갱신하는 경우가 많다

- 부분 갱신에는 원자적 갱신 연산자를 사용한다

- 갱신 연산자는 키를 변경,추가,제거하고, 심지어 배열과 내장 도큐먼트를 조작하는 복잡한 갱신 연산을 지정하는데 사용하는 특수키다.

- 연산자를 사용할 때 "_id" 값은 변경할 수 없다.(변경하려면 도큐먼트 전체를 치환한다)

 

- $inc 제한자

db.analytics.updateOne({"url" : "www.naver.com"}, .. {$inc : {"pageviews" : 1}})

=> 해당 코드는 pageviews라는 값을 1씩 증가시켜주는 코드다

=> $inc에 키의 값은 무조건 숫자여야 한다.

=> 증감하는 제한자다

 

- $set 제한자

db.analytics.updateOne({"url" : "www.naver.com"}, .. {$set : {"data" : "hello"}})
// 이러면 해당하는 도큐먼트에 data 값이 있는 경우 hello로 변경되고 없다면 추가된다
db.analytics.updateOne({"url" : "www.naver.com"}, .. {$set : {"data" : ["h1llo1","hello2","hello3"]}})
// 이러면 해당하는 도큐먼트에 data 값이 있는 경우 hello1 2 3로 변경되고 없다면 추가된다

=> $set은 필드 값을 설정한다. 필드가 존재하지 않으면 새 필드가 생성된다.

=> 이 기능은 스키마를 갱신하거나 사용자 정의 키를 추가할 때 편리하다.

=> 키의 데이터형 변경도 가능하다

 

- $unset 제한자

db.analytics.updateOne({"url" : "www.naver.com"}, .. {$unset : {"data" : 1 }})

=> data 키 값을 가진 값을 모두 제거한다.

 

배열 연산자

- 배열을 다루는데 갱신 연산자를 사용할 수 있다

- 배열은 일반적이고 강력한 데이터 구조다.

- 연산자는  리스트에 데한 인덱스를 지정할 수 있을 뿐 아니라 셋처럼 이중으로 쓸 수 있다.

 

- $push

db.analytics.updateOne({"url" : "www.naver.com"}, .. {$push : {"data" : 1 }})

=> 배열이 이미 존재하면 배열 끝에 요소를 추가하고, 존재하지 않으면 새로운 배열을 생성한다.

 

배열을 집합으로 사용하기

- $ne : 특정 값이 배열에 존재하지 않을 때 해당 값을 추가하면서, 배열을 집합처럼 처리하려면 쿼리 도큐먼트에 "$ne"를 사용한다.

db.analytics.updateOne({"url" : {$ne : "Richie"}}, .. {$push : {"url" : "Lora" }})

=> url 값에 Lora를 넣을건데, url이 애초에 존재하지 않거나 한다면 "Richie" 이름을 넣거라

 

요소 제거하기

- $pop : 배열에서 요소를 제거하는 방법에는 몇가지가 있다

{"$pop" : {"$key" : 1}}