도큐먼트 삽입
- 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}}
'DB > MongoDB' 카테고리의 다른 글
[MongoDB] 쿼리 (0) | 2024.02.26 |
---|---|
MongoDB소개 (0) | 2024.02.14 |