MongoDB CRUD 기초

Jelkov Ahn·2021년 12월 24일
0

mongoDB

목록 보기
1/2
post-thumbnail

MongoDB 도큐먼트 기본

  • id 필드를 기본값으로 반드시 가지고 있어야 한다!!
    -> 이 id 필드의 값은 각 도큐먼트를 구별하는 역할을 합니다.

  • 도큐먼트 내부의 필드와 값이 같더라도, id 값이 다르면 서로 다른 도큐먼트 이다.
    반면에 필드와 값이 다르다고 하더라도, id 값이 같으면 서로 같은 도큐먼트로 여겨진다. (에러 발생 주의)
    -> 따라서 각 도큐먼트는 고유한 id 값을 가지고 있어야 합니다.

  • 새로운 도큐먼트를 추가할 경우 보통은 ObjectId 타입의 값으로 사용합니다.
    도큐먼트를 추가할 때 Id필드와 값을 특정하지 않으면, 자동적으로 id필드가 생성되고 값에 ObjectId 타입이 할당된다.

CREATE

1. mongo shell 사용, 한개의 새로운 도큐먼트 추가

1) 터미널 사용 아틀라스 클라스터에 연결
2) MongoDB 샘플 데이터 받아옴
3) 사용하려는 DB로 이동한다.

4) 그림에 보이는 도큐먼트 보면, ObjectId 타입(12byte, 24char)의 값이 id로 작성되어 있는 것을 확인할 수 있다.
5) 이 도큐먼트를 MongoDB 샘플 데이터베이스 중 하나인 zips라고 하는 컬렉션에 삽입!
삽입을 하기 위해서는 insert라는 명령어를 사용하게 됩니다.

6) insert( )의 괄호 안에 삽입하고자 하는 도큐먼트를 작성.
그리고 이 명령어에 따른 결과물이 하단에 WriteResult로 출력!

7) WriteResult에 “nInserted”라는 항목은 삽입된 도큐먼트의 를 의미.
-> 이 부분이 0인 것으로 보아, 삽입된 도큐먼트가 없다는 뜻이므로 도큐먼트 추가에 실패했다는 것을 알수 있다.

8) writeError 통해, duplicate key 에러라고 하는 이유로 추가가 되지 않았음을 알 수 있다.
-> duplicate key 에러는 이미 같은 id 값을 가지는 도큐먼트가 컬렉션 내부에 존재하기 때문에 중복된 데이터는 삽입할 수 없다는 것을 의미.

9) Id값을 삭제한후 삽입작업! 동일한 도큐먼트의 내용을 가지고 있지만, 아래 파란색 블록의 부분에서는 id 값을 삭제한 후 삽입 작업을 실행!
-> 그 결과, WriteResult({“nInserted” : 1}) 로 zips 컬렉션에 우리가 작성한 1개의 도큐먼트가 삽입되었다는 것을 알 수 있다.

10) find 명령어를 이용해 검색, 데이터 조회
-> 검색을 해보니 2개의 결과가 출력,
하나는 기존 데이터베이스에 존재하던 도큐먼트이고, 또 다른 하나는 방금 추가한 도큐먼트!
두 결과의 유일한 차이점은 id 값이고, 두 번째로 삽입한 도큐먼트에는 id 필드값을 추가하지 않았음에도 도큐먼트가 삽입될 때 자동적으로 해당 값이 추가됨!
그리고 기본 값으로 ObjectId를 생성하여 할당하였다는 것을 알 수 있음.

이처럼 id 값에 따라 도큐먼트가 구별된다는 것을 duplicate key 에러를 통해 다시 한번 확인했습니다.

이로써 insert를 통해 컬렉션에 도큐먼트를 추가할 수 있는 방법에 대해서 알아 보았다.

2. mongo shell 사용, 다수의 새로운 도큐먼트 추가

한 번에 다수의 도큐먼트를 삽입하기 위해서는 배열 안에 해당하는 도큐먼트를 담아야 한다.

배열 안 요소인 도큐먼트는 test라는 1개의 필드를 가지고 있고, id 값은 주어지지 않음.
따라서 inspections 컬렉션 내의 다른 도큐먼트와 구조상으로도, 내용상으로도 중복되지 않은 도큐먼트들 이다.

이에 따른 결과는 주황색 블록과 같고, writeErrors가 빈 배열인 것으로 보아 에러는 발생하지 않았다.

또한 nInserted 필드의 3이라는 숫자로 보아 3개의 도큐먼트가 모두 다 추가된 것을 알 수 있다..

이번에는 추가하려는 도큐먼트에 모두 id 값을 지정함.

첫 번째 도큐먼트와 두 번째 도큐먼트에는 동일한 id 값을 주었고, 이에 따라 duplicate key 에러가 발생함.

주황색 블록 안의 nInserted 항목을 보니, 1개의 도큐먼트가 삽입이 되었다.

하늘색 블록을 확인하니, 첫 번째 도큐먼트인 {“test” : “1” }이 삽입되었다.

다량의 도큐먼트가 삽입될 때, 삽입이라는 작업을 수행하기 위한 기본 프로세스가 배열 안의 리스트 된 순서대로 진행이 됨.

1번 인덱스에 해당하는 도큐먼트인 {“test” : “2”}에서 duplicate key 에러가 발생하면서 2번 인덱스인 {“test” : “3”}은 실행이 되지 않았기 때문에, 에러 메시지에서 1번 인덱스에 대한 에러 메시지만 확인이 가능함.

배열안의 리스트 된 순서 수정은 가능하다.

순서를 바꾸기 위해서는 insert 명령어의 2번째 인자에 순서 옵션인 ordered를 추가하면 된다.

이번에도 이전과 똑같이 [{“_id" : "1", "test": "1"}, {"_id" : "1", "test": "2"}, {"_id" : "3", "test": “3"}] 도큐먼트를 삽입하는 쿼리문을 작성하였습니다.
그러자 마찬가지로 duplicate key 에러가 발생하게 되고, nInserted 항목으로 미뤄보아 1개의 도큐먼트가 추가된 것을 알 수 있다.

하늘색으로 표기
우선 0번 인덱스를 가지는 도큐먼트의 경우 이미 이전에 삽입한 도큐먼트이기 때문에 duplicate key 에러가 발생하였고, 1번 인덱스의 도큐먼트는 0번 인덱스의 도큐먼트와 id 값이 같기 때문에 마찬가지로 duplicate key 에러가 발생한다.

따라서 이번 insert 명령어를 통해 inspections 컬렉션에 추가된 도큐먼트는 인덱스가 2번인 {"_id" : "3", "test": “3"} 마지막 도큐먼트라는 것을 알 수 있다.

order vs 기본

기본적으로 내장된 순서(주어진 도큐먼트 배열의 인덱스 순서)로 삽입되는 경우,
duplicate key 에러가 나오는 순간 작업은 중단됩니다.
-> 나머지 도큐먼트들이 고유한 id를 가진다고 해도 {"_id" : "3", "test": “3”} 처럼 작업이 진행될 기회가 오지 않는다.

그러나 삽입하는 작업에 순서가 없다면 고유한 id를 가지는 모든 도큐먼트는 컬렉션에 추가됩니다.
이를 통해 ordered 옵션을 추가함으로 삽입 순서를 바꿀 수 있다는 것을 알 수 있다.

추가 내용

만약 존재하지 않는 컬렉션에 도큐먼트를 추가한다면, MongoDB는 그와 동시에 컬렉션이 만들어지게 됩니다.

READ


1) 터미널로 아틀라스 클러스터에 접속합니다.

2) 접속한 뒤, 미리 받아둔 MongoDB에서 샘플로 제공하는 데이터베이스 리스트를 터미널에서 확인하겠습니다. show dbs

-> sample_로 시작하는 데이터베이스가 MongoDB가 테스트용으로 제공하는 더미(dummy)이다.

3) sample_training 데이터베이스를 사용한다고 하면, use sample_training이라는 명령어를 입력합니다.

데이터베이스가 어떤 컬렉션을 가지고 있는지 보고 싶다면 앞서 데이터베이스 리스트를 확인하기 위해서 사용했던 show라는 명령어를 다시 사용합니다. show collections

4)

zip 관련 데이터를 조회하려고 합니다. find라는 명령어를 사용합니다.
이미 필요한 데이터베이스 공간으로 이동했기 때문에 사용할 데이터베이스의 이름을 특정해서 작성할 필요가 없습니다. 위 명령어에서 db는 sample_training가 있다.

5) db.zips.find({"state":"NY"})의 결과

이때 find 명령어에 따른 실제 결과물은 화면에 출력된 것보다 훨씬 많지만 화면에는 랜덤하게 선택된 20개 결과물만 출력됩니다.

해당 조건에 맞는 다음 20개의 도큐먼트를 조회하기 위해서는, 화면의 주황색 블록과 같이 iterate의 줄임말인 it 명령어를 사용해야 합니다.

6) 만약 zips 컬렉션의 데이터 중 뉴욕 주에 위치한 ALBANY시의 우편번호만 보고 싶다고 하면 어떻게 해야 할까요?

7) 그렇다면 만약 zips 컬렉션의 데이터 전체를 보고 싶다고 하면 어떻게 해야 할까요?
-> find 명령어를 조건 쿼리문 없이 사용하면 됩니다.

8) 조금 더 예쁘게 출력되도록 pretty( )라고 하는 명령어를 덧붙여 사용하겠습니다.


-> pretty 후에 ~

9) 데이터의 수를 조회하기 위해서는 count( )라고 하는 명령어를 사용합니다.

10) 이번에는 특정한 1개의 데이터만을 조회하려고 합니다.
고유한 값인 id를 조건으로 주어 데이터를 특정하겠습니다.
그 결과로 주황색 블록과 같이 데이터 1개가 출력되는 것을 볼 수 있습니다.

무작위의 데이터 1개만 가져올 수도 있습니다.
-> 조건 쿼리문을 작성하지 않은 상태의 findOne( )을 사용하면 됩니다.

update

updateOne : 주어진 기준에 맞는 다수의 도큐먼트 중 첫번째 도큐먼트 하나만 업데이트

updateMany: 쿼리문과 일치하는 모든 도큐먼트를 업데이트

1) {“city”:”ALPINE”} 인 도큐먼트를 찾아보니, 총 9개의 도큐먼트가 확인됨.

해당 9개 도큐먼트의 pop 필드인 인구수를 각각 10명씩 늘려 한 번에 업데이트!

2) 다수의 업데이트후 확인 updateMany inc

matchedCount와 modifiedCount로 나뉩니다.
해당 부분은 명령어에 들어가는 쿼리문 2개에 대한 응답입니다.

matchedCount는 첫 번째 인자로 들어간 조건을 충족하는 도큐먼트의 수를 의미합니다.
여기서는 우리가 앞서 찾았던 도큐먼트의 수인 9가 출력되었습니다.

modifiedCount는 두 번째 인자로 들어간 업데이트 연산자 $inc로 인해 수정된 도큐먼트의 수를 의미합니다.

3) 하나의 업데이트 updateOne set
$set 연산자를 사용하면 주어진 필드에 지정된 값을 업데이트합니다.

4) 필드 이름을 잘못 작성한다면 어떤 일이 발생하게 될까요?
-> pop을 population으로 잘못 작성
-> MongoDB 는 주어진 필드 이름이 기존에 없는 이름인 경우, 해당 필드를 추가합니다.
따라서 현재 이 도큐먼트 안에는 같은 값을 가지는 pop과 population 두 개의 필드가 존재합니다.

5) push & Grade 컬렉션
grades 컬렉션은 슬라이드와 같이 score 필드에 대한 값이 배열로 이루어져 있기 때문에, 이제부터 배우게 되는 push연산자를연습해보기에적합합니다.push 연산자를 연습해 보기에 적합합니다. push 연산자는 간단하게 말하자면, 배열로 이루어진 필드의 값에 요소를 추가하기 위한 연산자입니다.

Delete

deleteOne : 주어진 기준에 맞는 다수의 도큐먼트 중 첫번째 도큐먼트 하나를 삭제
deleteMany: 쿼리문과 일치하는 모든 도큐먼트를 삭제

1) DeleteMany
-> deletedCount 항목의 숫자와 하늘색 블록의 find 명령어로 찾은 도큐먼트의 수를 비교해 보니, {“test” : “1”}, {“test” : “3”} 이라는 기준에 맞는 도큐먼트를 한 번에 삭제한 것을 확인할 수 있습니다.

2) DeleteOne
-> 이 도큐먼트를 deleteOne을 사용해서 삭제하니, 삭제된 도큐먼트의 수를 의미하는 deletedCount에 1이 나타나는 것을 볼 수 있습니다.

3) 컬렉션을 삭제하기 위해서는 drop이라는 명령어를 사용해야 합니다. db.colletion_name.drop()

결론)
-> 컬렉션 삭제를 위해서는 drop, 도큐먼트 삭제를 위해서는 deleteOne, deleteMany 명령어

profile
끝까지 ... 가면 된다.

0개의 댓글