[MongoDB] 도큐먼트 삽입

참조

  • 몽고DB 완벽가이드 3판


1. 도큐먼트 삽입

  • 삽입은 몽고DB에 데이터를 추가하는 기본 방법입니다.
  • 도큐먼트를 삽입하려면 컬렉션의 insertOne 메서드를 사용하면 됩니다.
  • 아래와 같이 명령어를 사용하게 되면, movies 라는 컬렉션에 title 키를 가진 Stand by Me 값이 삽입되었다는 의미입니다.
  • 도큐먼트에 "_id" 키도 추가가 됩니다.
    db.movies.insertOne({"title" : "Stand by Me"});


1.1 insertMany

  • 여러 도큐먼트를 컬렉션에 삽입하려면 insertMany 로 도큐먼트 배열을 데이터베이스에 전달합니다.
  • 코드가 삽입된 각 도큐먼트에 대해 데이터베이스로 왕복하지 않고 도큐먼트를 대량 삽입 하므로 훨씬 더 효율적입니다.
db.movies.insertMany([{"title" : "Ghostbusters"},
                      {"title" : "Stand by Me"},
                      {"title" : "태극기 휘날리며"},
                      {"title" : "어벤져스"},
                      {"title" : "이터널 션샤인"}]);
[
  {
    "_id": {
      "$oid": "617fbbd508ae0ce2a6473bd8"
    },
    "title": "Ghostbusters"
  },
  {
    "_id": {
      "$oid": "617fbbd508ae0ce2a6473bd9"
    },
    "title": "Stand by Me"
  },
  {
    "_id": {
      "$oid": "617fbbd508ae0ce2a6473bda"
    },
    "title": "태극기 휘날리며"
  },
  {
    "_id": {
      "$oid": "617fbbd508ae0ce2a6473bdb"
    },
    "title": "어벤져스"
  },
  {
    "_id": {
      "$oid": "617fbbd508ae0ce2a6473bdc"
    },
    "title": "이터널 션샤인"
  }
]
  • 위와 같이 수십, 수백, 심지어는 수천 개의 도큐먼트를 한 번에 전송하면 도큐먼트 삽입이 매우 빨라집니다.
  • insertMany는 여러 도큐먼트를 단일 컬렉션에 삽입할 때 유용한 함수 입니다.


1.1.1 insertMany 제약 사향

  • 몽고DB의 현재 버전은 48 메가바이트보다 큰 메시지를 허용하지 않으므로 한 번에 일괄 삽입 할 수 있는 데이터의 크기에는 제한이 있습니다.
  • 48 메가바이트보다 큰 삽입을 시도하면 많은 드라이버는 삽입된 데이터를 48 메가바이트 크기의 일괄 삽입 여러 개로 분할합니다.


1.1.2 insertMany 특정 유형의 오류

  • insertMany를 사용해 대량 삽입할 때 배열 중간에 있는 도큐먼트에서 특정 유형의 오류가 발생하는 경우가 있습니다.
  • 이 경우에는 정렬 연산을 선택했는지 혹은 비정렬 연산을 선택했는지에 따라 발생하는 상황이 달라집니다.
  • insertMany에 대한 두 번째 매개변수로 옵션 도큐먼트를 지정할 수 있습니다.
  • 도큐먼트가 제공된 순서대로 삽입되도록 옵션 도큐먼트에 "ordered" 키게 true를 지정합니다.
  • false를 지정하면 몽고DB가 성능을 개선하려고 삽입을 재배열 할 수 있습니다.
  • 순서가 지정 되지 않았다면 정렬된 삽입 이 기본값입니다.
  • 다음 예에서는 정렬된 삽입이 기본값이므로 처음 두 개의 도큐먼트만 삽입됩니다.
db.movies.insertMany([{"_id" : 0, "title" : "Top Gun"},
                      {"_id" : 1, "title" : "태극기 휘날리며"},
                      {"_id" : 1, "title" : "어벤져스"},
                      {"_id" : 2, "title" : "이터널 션샤인"},
                      {"_id" : 3, "title" : "쏘우"},
                      {"_id" : 3, "title" : "해운대"},]);
E11000 duplicate key error collection: jbh_MongoDB.movies index: _id_ dup key: { _id: 1 }
  • _id 가 동일한 도큐먼트를 두 개 이상 삽입할 수 없으므로 세 번째 도큐먼트가 오류를 발생시켰습니다.
  • 아래와 같이 정렬되지 않은 삽입을 지정하면 배열의 첫 번째, 두 번째, 네 번째, 다섯 번째 도큐먼트가 삽입됩니다.
  • 세 번째 도큐먼트만 중복된 "_id" 오류 때문에 삽입에 실패합니다.
db.movies.insertMany([
                      {"_id" : 0, "title" : "Top Gun"},
                      {"_id" : 1, "title" : "태극기 휘날리며"},
                      {"_id" : 1, "title" : "어벤져스"},
                      {"_id" : 2, "title" : "이터널 션샤인"},
                      {"_id" : 3, "title" : "쏘우"},
                      {"_id" : 4, "title" : "해운대"}
                   ], {ordered : false});
E11000 duplicate key error collection: jbh_MongoDB.movies index: _id_ dup key: { _id: 1 }


1.2 삽입 유효성 검사

  • 몽고DB는 삽입된 데이터에 최소한의 검사를 수행합니다.
  • 도큐먼트의 기본 구조를 검사해 _id 필드가 존재하지 않으면 새로 추가하고, 모든 도큐먼트는 16메가바이트보다 작아야 하므로 크기를 검사합니다.
  • 이처럼 최소한의 검사를 하는 이유는, 유효하지 않은 데이터가 입력되는 것을 막기 위함입니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY