TIL 27일차 - [데이터베이스] NoSQL : MongoDB CRUD

tamagoyakii·2022년 4월 22일
0

TIL

목록 보기
26/31
post-thumbnail

🌈 MongoDB CRUD

데이터베이스에 저장된 정보에 접근하기 위해서는 일단 아틀라스 클러스터에 접속해야 한다.

mongo "mongodb+srv://{mongodb_atlas_srv}" --username "{username}"

접속한 뒤 데이터베이스 목록을 살펴보고 싶다면 아래 명령어를 사용하면 된다.

show dbs

데이터베이스 목록을 살펴봤다면, 특정 데이터베이스에 접근해보자.

use 데이터베이스_이름

위에 사용한 show 명령어는 현재 위치한 데이터베이스가 가지고 있는 컬렉션 리스트를 보고싶을 때 사용할 수도 있다.

show collections

이제 컬렉션에 들어있는 데이터들을 추가하거나 수정할 수 있는 CRUD 명령어에 대해서 알아보자.

𝟙. Create

컬렉션에 데이터를 추가하기 위해서는 insert() 명령어를 사용한다. 사용 예시는 아래와 같다.

db.컬렉션_이름.insert({
	"_id": "1",
    "name": "Alistar",
    "age": 23
	})

여기서 db는 현재 위치한 데이터베이스를 뜻하며, 데이터베이스의 이름을 적어주지 않아도 된다. 위의 예시처럼 insert() 명령어를 사용해 도큐먼트를 추가하면 명령어에 따른 결과물이 하단에 WriteResult로 출력된다. WriteResult의 "nInserted" 항목은 추가된 도큐먼트의 수를 뜻한다. 이 항목을 통해 도큐먼트 삽입이 성공했는지 아닌지 알 수 있다.

MongoDB의 도큐먼트는 공통적으로 _id 필드를 가지고 있다. 도큐먼트 내부의 필드와 값이 같아도 _id 값이 다르다면 다를 도큐먼트로 취급하며, 필드와 값이 달라도 _id 값이 같다면 같은 도큐먼트로 취급해 에러가 발생한다. 만약 도큐먼트를 추가할 때 _id 필드와 값을 특정하지 않았다면, 자동적으로 _id 필드가 생성되고 값에 ObjectId 타입이 할당된다.

db.컬렉션_이름.insert([{"_id": "1", "name": "Malphite", "age": 40},
    			{"_id": "1", "name": "Ziggs", "age": 13},
                {"_id": "2", "name": "Ezreal", "age": 25}])

한 번에 여러 도큐먼트를 추가하기 위해서는 위 예시처럼 추가할 도큐먼트들을 배열 안에 넣어주면 된다. 여기서 주의해야할 점이 있는데, 앞에서 설명했듯이 _id는 도큐먼트 고유의 값이기 때문에 중복되는 값이 있을 경우 에러가 발생한다. 위 예시처럼 추가를 한다면 "nInserted" 값은 1로 출력될 것이다.

성공적으로 추가된 도큐먼트는 "Malphite"이다. 삽입이라는 작업을 수행하기 위한 기본 프로세스가 배열 안의 리스트 된 순서대로 진행되기 때문이다. 때문에 "Malphite"가 추가된 후 "Malphite"와 "Ziggs"의 _id 값이 같아 에러가 나면서 그 뒤의 도큐먼트들은 추가되지 않는다. 위의 상황에서 "Ezreal"의 값도 추가하고 싶다면 어떻게 해야 할까?

db.컬렉션_이름.insert([{"_id": "1", "name": "Malphite", "age": 40},
    			{"_id": "1", "name": "Ziggs", "age": 13},
                {"_id": "2", "name": "Ezreal", "age": 25}],
                { "ordered": false })

이렇게 배열 다음에 ordered 옵션을 추가하면 된다. 작업하는 순서를 없앰으로 고유한 _id를 가지는 모든 도큐먼트는 컬렉션에 추가되는 것이다.

만약 _id값이 없이 컬렉션이 추가되면 컬렉션이 알아서 도큐먼트에 _id값을 부여한다. 또 존재하지 않는 컬렉션에 도큐먼트를 추가한다면 그와 동시에 컬렉션이 만들어진다.

𝟚. Read

컬렉션에서 특정 값을 가지고 있는 도큐먼트를 찾을 때는 find() 명령어를 사용한다.

db.컬렉션_이름.find({“position” : “mid”})

find() 명령어를 사용하면 해당 조건에 맞는 도큐먼트들이 랜덤하게 20개씩 출력된다. 다음 페이지로 이동하고 싶다면 iterate의 줄임말인 it 명령어를 사용하면 된다. 여러가지 조건 추가하고 싶다면 아래 예시처럼 추가해주면 된다.

db.컬렉션_이름.find({“position” : “mid”, "type": "slayer"})

find() 명령어와 함께 사용되는 추가 명령어를 살펴보자.

  • find(): 컬렉션의 모든 도큐먼트 리스트 출력
  • pretty(): 리스트를 보기 좋게 출력
  • count() : 데이터 리스트의 총 갯수 출력
  • findOne({"field": "value"}) : 특정 한개의 데이터만 조회하고 싶을 때

𝟛. Update

업데이트는 크게 두 가지로 나누어진다. updateOneupdateMany이다. 글자에서 알 수 있듯이 updateOne은 하나의 도큐먼트를 업데이트할 때, updateMany는 여러 개의 도큐먼트를 업데이트할 때 사용된다. 아래와 같은 형식으로 사용한다.

db.컬렉션_이름.updateMany({"type":, "slayer"}, {업데이트_내용})

여기서 앞의 {"field": "value"}는 업데이트할 도큐먼트를 결정하는 조건이다. 뒤의 업데이트 내용을 작성하기 위해서는 몇 가지 MQL(MongoDB Query Language) 연산자를 알아야 한다.

  • $inc : 값을 증가시키기 위해 사용된다.
db.컬렉션_이름.updateMany({"type":, "tank"},
					{"$inc": {"ability_damage": 5}})
         			// 모든 tank의 ability_damage를 5만큼 증가
  • $set : 값을 변경하거나 추가하기 위해 사용된다.
db.컬렉션_이름.updateOne({"name":, "Ash"},
					{"$set": {"position": "supporter"}})
         			// Ash의 position을 supporter로 변경
  • $push : 배열로 이루어진 필드의 값에 요소를 추가한다.
db.컬렉션_이름.updateOne({"name":, "Miss Fortune"},
					{"$push": {"skills": {"e": "make it rain"}}})
         			// Miss Fortune의 skills에 서브 도큐먼트 e를 추가

업데이트 작업에 대한 응답은 matchedCountmodifiedCount로 나뉜다. matchedCount는 조건을 충족하는 도큐먼트의 수를 의미하며, modifiedCount는 수정된 도큐먼트의 수를 의미한다. 두 값이 동일하게 출력될 때 업데이트 작업이 성공적으로 완료되었다는 것을 알 수 있다.

𝟜. Delete

도큐먼트의 삭제에는 deleteOne()deleteMany() 명령어를 사용한다. 기본적으로 업데이트의 updateOne(), updateMany()와 비슷하다.

db.컬렉션_이름.deleteMany({"type": "top"})

조건에 충족하는 도큐먼트가 많을 경우 의도하지 않은 도큐먼트가 삭제될 수 있기 때문에 deleteOne()을 사용할 때는 _id 값으로 도큐먼트를 찾아 삭제하는 것이 좋다.

삭제 명령어의 응답에는 삭제된 도큐먼트의 수를 의미하는 deletedCount가 있다. 이 값을 통해 삭제가 성공적으로 이루어졌는지 알 수 있다.

도큐먼트가 아닌 컬렉션 자체를 삭제하고 싶다면 drop() 명령어를 사용하면 된다.

db.컬렉션_이름.drop()

위 명령어를 사용하면 컬렉션 삭제 성공 여부가 true / false 로 출력되며, 앞에서 배운 show collections 명령어로 삭제 후의 컬렉션 리스트를 확인해볼 수 있다.

0개의 댓글