티스토리 뷰
728x90
반응형
3.1 도큐먼트 삽입
insertOne 메서드 사용
> db.movies.insertOne({"title" : "StarWars"})
3.1.1 insertMany
- 각 도큐먼트에 대해 데이터베이스로 왕복하지 않고 bulk insert 처리
- 단일 컬렉션에 삽입할 때 유용
- 48mbyte 크기씩 분할 삽입
- 두번째 매개변수로 옵션 도큐먼트 지정
- "ordered" : true (default) 정렬된 삽입, 오류발생하면 이후 삽입 X
- "ordered" : false 정렬되지 않은 삽입, 오류발생 관계없이 모두 삽입 시도
3.1.2 삽입 유효성 검사
"_id" 필드가 없으면 새로 추가
모든 도큐먼트는 16mbyte 크기 제한
3.1.3 삽입
insertOne, insertMany
3.2 도큐먼트 삭제
- deleteOne은 필터와 일치하는 첫 번째 도큐먼트를 삭제
- 필터와 일치하는 모든 도큐먼트를 삭제하려면 deleteMany
> db.movies.deleteOne({"_id" : 4})
> db.movies.deleteMany({"year" : 1984})
3.2.1 drop
deleteMany 보다 drop으로 전체 삭제 빠름
> db.movies.deleteMany({})
> db.movies.drop()
3.3 도큐먼트 갱신
요청이 동시에 발생하면 서버에 먼저 도착한 요청이 적용. 원자성
3.3.1 도큐먼트 치환
- replaceOne 도큐먼트를 새로운 것으로 치환
- 스키마 마이그레이션에 유용
- "_id" 키로 일치하는 고유한 도큐먼트를 갱신 대상으로 지정하는 것이 좋다
> db.people.replaceOne({"id" : ObjectId("332490sdrfewre")}, joe)
3.3.2 갱신 연산자
- 부분 갱신에는 원자적 갱신 연산자(update operator)를 사용
- 키를 변경, 추가, 제거, 배열, 도큐먼트를 조작하는 복잡한 갱신 연산을 지정
- 연산자를 사용할 때 "_id" 값은 변경할 수 없다.
> db.analytics.updateOne({"url" : "www.example.com"},
...{"$inc" : {"pageviews" : 1}}) //pageviews 값을 증가
"$set" 제한자
- 필드 값을 설정, 존재하지 않으면 새 필드 생성
- 키의 데이터형도 변경 가능
- "$unset" 으로 키와 값 제거
- 내장 도큐먼트 내부의 데이터 변경
> db.users.updateOne({"_id" : ObjectId("4b34asdfjisdo")},
...{"$set" : {"favorite book" : "War and Peace"}})
> db.users.updateOne({"name" : "joe"},
...{"$set" : {"favorite book" : ["One", "Two", "Three"]}})
> db.users.updateOne({"name" : "joe"},
...{"$unset" : {"favorite book" : 1}})
"$inc" 연산자
- "$inc" 연산자는 존재하는 키의 값을 변경하거나 새 키를 생성
- 자주 변하는 수치 값을 갱신하는데 유용
- int, long, double, decimal 숫자 타입 값에만 사용
> db.games.updateOne({"game" : "pinball", "user" : "joe"},
...{"$inc" : {"score" : 50}})
배열 연산자
배열 연산자는 배열을 값으로 갖는 키에만 사용
- "$push" 는 배열이 존재하면 배열 끝에 요소를 추가, 존재하지 않으면 새로운 배열 생성
> db.blog.posts.updateOne({"title" : "A blog post"},
...{"$push" : {"comments" :
... {"name" : "joe", "email" : "joe@email.com", "content" : "nice"}}})
- "$each" 제한자를 사용하여 한번에 여러 개 추가 가능
> db.stock.ticker.updateOne({"_id" : "GOOG},
...{"$push" : {"hourly" : {"$each" : [562.776, 562.790, 559.123]}}})
- "$slice" 를 "$push"와 결합하여 배열을 특정 길이로 늘린다
- 도큐먼트 내에 큐를 생성하는데 사용
> db.movies.updateOne({"genre" : "horror"},
...{"$push" : {"top10" : {"$each" : ["Nightmare", "Saw"],
"$slice" : -10}}}) //요소의 개수를 10으로 제한.
//10보다 크면 마지막 10개 요소만 유지.
- "$sort" 제한자를 "$push" 작업에 적용
> db.movies.updateOne({"genre" : "horror"},
...{"$push" : {"top10" : {"$each" : [{"name" : "Nightmare", "rating" : 6.6},
... {"name" : "Saw", "rating" : 4.3}],
... "$slice" : -10,
... "$sort" : {"rating" : -1}}}})
배열을 집합으로 사용하기
- "$ne" 특정 값이 배열에 존재하지 않을 때 해당 값을 추가. 배열을 집합처럼 처리
> db.papers.updateOne({"authors cited" : {"$ne" : "Richie"}},
... {"$push" : {"authors cited" : "Richie"}})
- "$addToSet" 중복 값을 피해 배열에 추가
- 여러개 추가하려면 "$each" 결합하여 사용
> db.users.updateOne({"_id" : ObjectId("4sdaf4i")},
... {"$addToSet" : {"emails" : {"$each" : ["joe@php.net", "joe@example.com", "joe@pytho.org"]}}})
요소 제거하기
- "$pop" 배열을 큐나 스택처럼 요소 제거
- {"$pop" : {"key" : 1}} 배열의 마지막부터 요소 제거
- {"$pop" : {"key" : -1}} 배열의 처음부터 요소 제거
- "$pull" 조건과 일치하는 요소 모두 제거
배열의 위치 기반 변경
- 배열 인덱스는 0부터 시작, 인덱스를 도큐먼트의 키처럼 사용
- "$" 쿼리 도큐먼트와 일치하는 배열 요소 및 요소의 위치를 알아내서 갱신하는 위치 연산자
- 위치 연산자는 첫 번째로 일치하는 요소만 갱신
> db.blog.updateOne({"comments.author" : "John"},
... {"$set" : {"comments.$.author" : "Jim"}})
배열 필터를 이용한 갱신
- arrayFilters 개별 배열 요소를 갱신하는 배열 필터
> db.blog.updateOne({"post" : post_id},
... {"$set" : {"comments.$[elem].hidden" : true}},
... {arrayFilters : [{"elem.votes" : {$lte : -5}}]}) //votes가 -5 이하면
//배열의 각 일치 요소에 hidden 필드 추가
3.3.3 갱신 입력 upsert
- 갱신 조건에 맞는 도큐먼트가 존재하지 않을 때 새로운 도큐먼트 생성
- 조건에 맞는 도큐먼트가 있으면 갱신 수행
- 컬렉션 내에 시드 도큐먼트가 필요 없어 편리, 같은 코드로 도큐먼트를 생성, 갱신
- 코드를 줄이고, 경쟁 상태를 피할 수 있다.
- updateOne, updateMany 의 세번째 매개변수 옵션 도큐먼트로 갱신 입력을 지정
> db.analytics.updateOne({"url" : "/blog"},
... {"$inc" : {"pageViews" : 1}},
... {"upsert" : true})
- "$setOnInsert" 도큐먼트가 삽입될 때 필드 값을 설정하는 데만 사용하는 연산자
- 도큐먼트가 생성될 때만 필드 설정, 갱신에서는 변경되지 않음
- 패딩을 생성하고 카운터를 초기화하는데 사용, ObjectId를 사용하지 않는 컬렉션에 유용
> db.users.updateOne({}, {"$setOnInsert" : {"createAt" : new Date()}},
... {"upsert" : true})
저장 셸 보조자
- save는 도큐먼트가 존재하지 않으면 도큐먼트를 삽입, 존재하면 갱신하는 셸 함수
- 매개변수 하나, 도큐먼트를 넘겨받는다
- 도큐먼트가 "_id"를 포함하면 갱신 입력을 실행, 없으면 삽입 실행
> var x = db.testcol.findOne()
> x.num = 42
42
> db.testcol.save(x)
3.3.4 다중 도큐먼트 갱신
updateMany는 스키마를 변겨하거나 특정 사용자에 새로운 정보를 추가할 때 좋음
3.3.5 갱신한 도큐먼트 반환
사용자가 수정된 도큐먼트의 값을 원자적으로 얻을 수 있다
findOneAndUpdate 한번의 연산으로 항목을 반환하고 갱신할 수 있다
> db.processes.findOneAndUpdate({"status" : "READY"},
... {"$set" : {"status" : "RUNNING"}},
... {"sort" : {"priority" : -1}})
{
"_id" : ObjectId(~),
"priority" : 1,
"status" : "READY"
}
findOneAndUpdate 기본적으로 도큐먼트의 상태를 수정하기 전에 반환 (status : READY)
옵션 도큐먼트의 returnNewDocumentment 필드를 true로 설정하면 갱신된 도큐먼트 반환 (status : RUNNING)
> db.processes.findOneAndUpdate({"status" : "READY"},
... {"$set" : {"status" : "RUNNING"}},
... {"sort" : {"priority" : -1},
... {"returnNewDocument" : true})
{
"_id" : ObjectId(~),
"priority" : 1,
"status" : "RUNNING"
}
728x90
반응형
'DB > MongoDB' 카테고리의 다른 글
[MongoDB] 공간 정보 인덱스 (0) | 2023.04.26 |
---|---|
[MongoDB] 인덱싱2 (0) | 2023.04.18 |
[MongoDB] 인덱싱 (0) | 2023.03.22 |
[MongoDB] 쿼리 (0) | 2023.03.15 |
[MongoDB] 기본 (0) | 2023.03.06 |
반응형
300x250