MongoDB TIL 03

Nabang Kim·2021년 9월 3일

MongoDB

목록 보기
3/10
post-thumbnail

2021년 9월 3일에 작성된 문서 3번 입니다.
MongoDB 배운 내용을 정리했습니다.



MongoDB CRUD - CREATE (Insert 명령어)

MongoDB 도큐먼트 _id

모든 MongoDB 도큐먼트는 고유한 _id 값을 가지고 있어야 한다.

  • _id 필드의 값: 각 도큐먼트 구별.
  • 새로운 도큐먼트를 추가할 때, _id 값에 ObjectId 타입(12byte, 24char)의 값으로 사용.
    • _id 필드와 값을 특정하지 않았다면, 자동적으로 _id 필드가 생성되고 값에 ObjectId 타입이 할당.



1. Insert 명령어

mongo shell을 사용하여 컬렉션에 새로운 도큐먼트를 추가해보도록 하겠습니다.

  1. 터미널을 사용해 아틀라스 클러스터에 연결
  2. MongoDB에서 제공하는 샘플 데이터를 받아온다.
  3. 데이터베이스 중 사용하려는 데이터베이스로 이동.

화면과 같이 작성된 도큐먼트를 보면, ObjectId 타입(12byte, 24char)의 값이 _id로 작성되어 있는 것을 확인 할 수 있습니다.



1-1. 도큐먼트를 MongoDB 샘플 데이터베이스 중 하나인 zips 컬렉션에 삽입

삽입을 하기 위해서는 insert라는 명령어를 사용.


1. insert로 도큐먼트를 삽입 하기 위해서 insert( )의 괄호 안에 삽입하고자 하는 도큐먼트를 작성
2. 이 명령어에 따른 결과물이 하단에 WriteResult로 출력

  • nInserted 항목 : 삽입된 도큐먼트 수
    • 이 부분이 0 = 삽입된 도큐먼트가 없다=도큐먼트 추가 실패
    • writeError => duplicate key 에러로 추가가 되지 않았음
    • duplicate key 에러 : 이미 같은 _id값을 가지는 도큐먼트가 컬렉션 내부에 존재해 중복된 데이터는 삽입 할 수 없다.



1-2. 같은 데이터이지만 _id 값을 지운 도큐먼트를 zips 컬렉션에 추가

  • 주황색 블록 : _id을 볼 수 있다.
  • 파란색 블록: 같은 도큐먼트의 내용을 가지고 있지만, _id 값을 삭제한 후 삽입 작업을 실행.
    • 결과 : WriteResult({“nInserted” : 1}) (zips 컬렉션에 작성한 1개의 도큐먼트가 삽입되었다)

같은 필드와 값으로 find(데이터를 조회하는 명령어)로 검색을 해보겠습니다.

  • 검색을 해보니 2개의 결과가 출력
    • 주황색이 기존 데이터베이스에 존재하던 도큐먼트
    • 파란색이 방금 추가한 도큐먼트
      • _id 필드값을 추가하지 않았어도 도큐먼트 삽입 될 때, 자동적으로 해당 값이 추가.
      • 기본 값으로 ObjectId를 생성하여 할당.
  • 두 결과의 유일한 차이점 : _id
    • _id 값에 따라 도큐먼트가 구별



1-3. 다수의 도큐먼트를 삽입

  • 한 번에 다수의 도큐먼트를 삽입하기 위해서는 배열 안에 해당하는 도큐먼트를 담아야한다.
    • 도큐먼트: test 필드 1개가 있고, _id 값은 주어지지 않았다.
    • inspections 내의 다른 도큐먼트와 중복되지 않은 도큐먼트들 .
  • 결과(주황색 블록) : writeErrors 빈배열 = 에러는 발생 안함.
    • nInserted 필드에 3이라는 숫자 = 3개의 도큐먼트가 모두 다 추가.

이번에는 추가하려는 도큐먼트에 모두 _id 값을 지정해주었습니다.

  • 첫번째, 두번째 도큐먼트에 동일 _id 값을 주었고, duplicate key 에러발생.
  • 주황색 블록 :
    • nInserted 항목 : 1개의 도큐먼트가 삽입

      어떤 도큐먼트가 에러 없이 삽입 되었을까요?
      하늘색 블록을 확인 하니, 첫번째 도큐먼트인 {“test” : “1” }이 삽입된 것으로 보입니다. 그렇다면 왜 그 중 1개만 삽입이 되었을까요?


  • 파란색 블록(에러부분) :
    • 문제 : 두 번째 도큐먼트 {“test” : “2”}
    • 세번째 도큐먼트 {“test” : “3”}에 대해서는 따로 주어진 정보가 없다.
  • 에러가 출력되는 이유:
    • 다량의 도큐먼트가 삽입 될 때, 삽입 작업을 수행하기 위한 기본 프로세스가 배열 안의 리스트된 순서대로 진행되기 때문

      따라서 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번인 도큐먼트



1-4. 존재하지 않는 inspection 이라는 컬렉션에 도큐먼트를 삽입

  • 없는 컬렉션에 데이터를 삽입해도 아무런 에러가 나지 않았다.

    MongoDB는 사용자가 쉽게 새로운 컬렉션이나 데이터베이스를 생성하기를 원했습니다. 만약 사용자가 존재하지 않는 컬렉션에 도큐먼트를 넣는 경우, 그와 동시에 컬렉션이 만들어지게 됩니다. 실제로 컬렉션이 생성되었는지 확인해보니, 주황색 블록처럼 inspection이 생성된 것을 확인할 수 있습니다.






Written with StackEdit.

0개의 댓글