3장. 도큐먼트 생성, 갱신, 삭제

두더지·2024년 4월 6일
0

[몽고DB 완벽 가이드] 책을 보고 정리한 내용입니다.

도큐먼트 삽입

몽고DB에 데이터를 추가하는 기본 방법. insertOne 메서드 사용.

> db.movies.insertOne({"title" : "Stand my Me"})

도큐먼트에 "_id" 키가 추가되고 도큐먼트가 몽고DB에 저장된다.

여러 도큐먼트를 컬렉션에 추가하려면 insertMany로 도큐먼트 배열을 전달한다.

> db.movies.insertMany([{"title" : "Ghostbusters"},
						{"title" : "E.T."},
                        {"title" : "Blade Runner"}]);

** 48메가바이트보다 큰 메세지는 허용하지 않아, 시도할 시 일괄 삽입 여러 개로 분할된다.

이 때, 중간 도큐먼트에서 오류가 발생할 시,정렬 연산/비정렬 연산을 선택했는지에 따라 발생하는 상황이 달라진다.
insertMany에 대한 두 번째 매개변수로 옵션 도큐먼트를 지정할 수 있는데, "ordered"키에 true(기본값)를 지정하면 도큐먼트가 제공된 순서대로 삽입이 되고 flase를 지정하면 삽입을 재배열할 수 있다. 즉, 재배열이 가능하다면 오류가 난 것만 제외하고 삽입이 되지만, 재배열이 되지 않을 시 오류가 난 도큐먼트부터는 삽입이 되지 않는다.

도큐먼트 삭제

deleteOne과 deleteMany 메서드 사용. 필터 도큐먼트를 첫 번째 매개변수로 사용.

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

필터 도큐먼트에 해당하는 도큐먼트가 여러개일 땐,
deleteOne은 첫 번째 도큐먼트만, deleteMany는 모두 제거된다.

전체 컬렉션을 삭제하기 위해선 drop을 사용하는게 편리하다.

> db.movies.drop()

데이터는 한 번 제거하면 영원히 사라진다.

도큐먼트 갱신

updateOne, updateMany, replaceOne과 같은 메서드들을 사용한다.
updateOne, updateMany는 필터 도큐먼트를 첫 번째 매개변수로, 변경 사항을 설명하는 수정자 도큐먼트를 두 번째 매개변수로 사용한다.
replaceOne도 첫 번째 매개변수로는 필터를 사용하지만 두 번째 매개변수는 필터와 일치하는 도큐먼트를 교체할 도큐먼트라는 점이 차이점이다.

도큐먼트 치환

{
	"_id" : ObjectId(/*생략*/),
    "name" : "joe",
    "friends" : 32,
    "enemies" 2
}
> var joe = db.users.findOne({"name" : "joe"});
> joe.relationships = {"friends" : joe.friends, "enemies": joe.enemies);
> joe.username = joe.name;
> delete joe.friends;
> delete joe.enemies;
> delete joe.name;
db.user.replaceOne({"name" : "joe"}, joe);

도큐먼트 치환할 때에는, 고유한 도큐먼트를 갱신 대상으로 지정하는 것이 좋다. ex. "_id" 키로 일치하는 고유한 도큐먼트를 지정

갱신 연산자

도큐먼트의 특정 부분만 갱신하는 경우가 많다. 갱신 연산자를 사용한다.

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

"pageviews" 키의 값을 증가시키기 위해 "$inc" 제한자를 사용.
연산자를 사용하여 "_id"의 값은 변경할 수 없고, 변경하기 위해선 도큐먼트 전체를 치환해야한다.

  • "$set" 제한자 : 필드 값을 설정한다. 필드가 존재하지 않을 시 새 필드를 생성한다.
> db.users.updateOne({"_id" : ObjectId(/*생략*/)},
...{"$set" : {"favorite book" : "War and Peace"}})

이때, "$set"은 데이터 형을 변경 시킬 수도 잇으며 내장 도큐먼트 내부의 데이터 또한 변경할 수 있다

"$unset"으로는 키와 값을 모두 제거한다.

  • "$inc" 연산자 : 이미 존재하는 키의 값을 변경하거나 새 키를 생성하는데 사용. 자주 변하는 수치 값을 갱신하는데 매우 유용.
> db.games.updateOne({"game" : "pinball", "user" : "joe"},
...{"$inc" : {"score" : 50}})

"$inc"는 숫자를 증감하기 위해 설계되었기 때문에 int, log, double. decimal 타입 값에만 사용할 수 있다.

  • "$push" : 배열이 존재하면 배열 끝에 요소를 추가시키고 존재하지 않으면 새로운 배열을 생성한다.
    또한 이 연산자에는 제한자를 제공한다.
> db.movies.updateOne({"genre" : "horror"},
...{"$push" : {"top10" : {"$each" : [{"name" : "Nightmare on Elm Street", "rating" : 6.6},
									{"name" : "Saw,"rating" : 4.3}],
                          "$slice" : -10,
                          "$sort" : {"rating" : -1}}}})

"rating" 필드로 배열의 모든 요소를 정렬한 후 처음 10개 요소를 유지한다. 이때, "$each"를 반드시 포함해야한다.

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

"$addToSet" 또한 비슷한데, 중복을 피할 수 있거나 고유한 값을 여러 개 추가하기 위해 필요하다.

  • "$pop" : 배열 요소를 제거할 때 사용. 배열 양 끝의 요소를 제거한다.

  • "$pull" : 지정된 조건에 따라 요소를 제거할 때 사용.

  • "$"문자 : 위치 연산자.

> db.blog.updateOne({"comments.author" : "John"},
... {"$set" : {"comments.$.author" : "Jim"}})

John이라는 사용자가 이름은 Jim으로 갱신하기 위해서 위치 연산자 가용. 위치 연산자는 첫 번째로 일치하는 요소만 갱신한다.

> db.blog.updateOne(
	{"post" : post_id },
    {$set : { "comments.$[elem].hidden" : true } },
    {
    	arrayFilters: [ { "elem.votes": { $lte: -5} } ]
    }
  )

명령은 "comments" 배열의 각 일치 요소에 대한 식별자로 elem을 정의한다. elem이 식별한 댓글의 투표값이 -5이하면 hiddem 필드를 추가하고 값을 true로 설정.

갱신입력

: 특수한 형태를 갖는 갱신으로, 갱신 조건에 맞는 도큐먼트가 존재하지 않을 때는 쿼리 도큐먼트와 갱신 도큐먼트를 합쳐서 새로운 도큐먼트를 생성.

> db.analytics.updateOne({"url" : ".blog"}, {"$inc" : {"pageviews" : 1}},
... {"upsert" : true})

해당 url 페이지에 방문할 때마다 pageview를 증가시키고 만일 처음 방문했다면 새로운 도큐먼트까지 생성
updateOne과 updateMany의 세 번째 매개변수는 옵션 도큐먼트로, 갱신 입력을 지정한다.

저장 셀 보조자

: save는 도큐먼트가 존재하지 않으면 도큐먼트를 삽입하고 존재하면 도큐먼트를 갱신하게 하는 셸 함수이다.

> var x = db.testcol.findOne()
> x.num = 42
> db.testcol.save(x)

:: save 사용

> var x = db.testcol.findOne()
> x.num = 42
db.testcol.replaceOne({"_id" : x._id}, x)

:: save 미사용

갱신한 도큐먼트 반환

findOneAndUpdate 메서드는 기본적으로 도큐먼트의 상태를 수정하기 전에 반환한다. 옵션 도큐먼트의 "returnNewDocumentment" 필드를 true로 설정하면 갱신된 도큐먼트를 반환한다. (세 번째 매개변수)
findOneAndReplace는 동일한 매개변수를 사용하며 교체 전이나 후에 필터와 일치하는 도큐먼트를 반환하고
findOneAndDelete도 유사하지만 갱신 도큐먼트를 매개변수로 사용하지 않으며 다른 두 메서드의 옵션을 부분적으로 가진다. 또한 삭제된 도큐먼트를 반환한다.

profile
컴공생의 밍기적

0개의 댓글