데이터베이스에 저장된 정보에 접근하기 위해서는 일단 아틀라스 클러스터에 접속해야 한다.
mongo "mongodb+srv://{mongodb_atlas_srv}" --username "{username}"
접속한 뒤 데이터베이스 목록을 살펴보고 싶다면 아래 명령어를 사용하면 된다.
show dbs
데이터베이스 목록을 살펴봤다면, 특정 데이터베이스에 접근해보자.
use 데이터베이스_이름
위에 사용한 show
명령어는 현재 위치한 데이터베이스가 가지고 있는 컬렉션 리스트를 보고싶을 때 사용할 수도 있다.
show collections
이제 컬렉션에 들어있는 데이터들을 추가하거나 수정할 수 있는 CRUD 명령어에 대해서 알아보자.
컬렉션에 데이터를 추가하기 위해서는 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
값을 부여한다. 또 존재하지 않는 컬렉션에 도큐먼트를 추가한다면 그와 동시에 컬렉션이 만들어진다.
컬렉션에서 특정 값을 가지고 있는 도큐먼트를 찾을 때는 find()
명령어를 사용한다.
db.컬렉션_이름.find({“position” : “mid”})
find()
명령어를 사용하면 해당 조건에 맞는 도큐먼트들이 랜덤하게 20개씩 출력된다. 다음 페이지로 이동하고 싶다면 iterate의 줄임말인 it
명령어를 사용하면 된다. 여러가지 조건 추가하고 싶다면 아래 예시처럼 추가해주면 된다.
db.컬렉션_이름.find({“position” : “mid”, "type": "slayer"})
find()
명령어와 함께 사용되는 추가 명령어를 살펴보자.
find()
: 컬렉션의 모든 도큐먼트 리스트 출력pretty()
: 리스트를 보기 좋게 출력count()
: 데이터 리스트의 총 갯수 출력findOne({"field": "value"})
: 특정 한개의 데이터만 조회하고 싶을 때
업데이트는 크게 두 가지로 나누어진다. updateOne
과 updateMany
이다. 글자에서 알 수 있듯이 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를 추가
업데이트 작업에 대한 응답은 matchedCount
와 modifiedCount
로 나뉜다. matchedCount
는 조건을 충족하는 도큐먼트의 수를 의미하며, modifiedCount
는 수정된 도큐먼트의 수를 의미한다. 두 값이 동일하게 출력될 때 업데이트 작업이 성공적으로 완료되었다는 것을 알 수 있다.
도큐먼트의 삭제에는 deleteOne()
과 deleteMany()
명령어를 사용한다. 기본적으로 업데이트의 updateOne()
, updateMany()
와 비슷하다.
db.컬렉션_이름.deleteMany({"type": "top"})
조건에 충족하는 도큐먼트가 많을 경우 의도하지 않은 도큐먼트가 삭제될 수 있기 때문에 deleteOne()
을 사용할 때는 _id
값으로 도큐먼트를 찾아 삭제하는 것이 좋다.
삭제 명령어의 응답에는 삭제된 도큐먼트의 수를 의미하는 deletedCount
가 있다. 이 값을 통해 삭제가 성공적으로 이루어졌는지 알 수 있다.
도큐먼트가 아닌 컬렉션 자체를 삭제하고 싶다면 drop()
명령어를 사용하면 된다.
db.컬렉션_이름.drop()
위 명령어를 사용하면 컬렉션 삭제 성공 여부가 true
/ false
로 출력되며, 앞에서 배운 show collections
명령어로 삭제 후의 컬렉션 리스트를 확인해볼 수 있다.