티스토리 뷰

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