본문 바로가기
Study/mongodb

04. MongoDB(몽고디비) Study - 데이터 입력 (insert)

by 블리드카가 2017. 10. 9.
728x90



     연습을 위해 MongoDB 클라이언트를 실행합니다.
    
    
  1. Insert

데이터를 Insert 하기전에 MongoDB는 자바스크립트처럼 변수를 할당할 수도 있고 function 을 만들 수도 있습니다.

사원 정보를 입력하기 위한 employee Collection을 생성하고 Insert를 위한 변수를 할당해보겠습니다.
m = { ename : "김몽고", depart : "개발팀", status : "A", height: 170  } 
arr = [{ ename : "최몽고", depart : "개발팀", status : "C", height: 185 }
         , { ename : "박몽고", depart : "개발팀", status : "B", height: 167} ]
기본적인 Insert 명령어는 3가지가 있습니다.

insert - 단일 또는 다수의 Document를 입력할 때 사용
insertOne - 단일 Document를 입력할 때 사용
insertMany - 다수의 Document를 입력할 때 사용

m 변수를 입력하고 결과를 확인해보겠습니다. 아래 find명령어가 SQL에서 SELECT에 해당하는 명령어 입니다.  데이터를 읽어들이는 명령어 입니다.
db.employee.insert(m)
db.employee.find()
 
arr 변수로 다수의 document를 한번에 입력하도록 하겠습니다.
db.employee.insert(arr)
db.employee.find()

이번에는 변수를 할당하지 않고 직접 insertOne 명령어를 사용하겠습니다.
db.employee.insertOne({ ename : "김디디", depart : "디자인팀", status : "B", height: 177 } )
db.employee.insertOne({ ename : "노정보", depart : "디자인팀", status : "B" })
다수의 document를 입력해보겠습니다.
db.employee.insertMany([ 
                                            { ename : "김디디", depart : "디자인팀", status : "A", height: 157 } 
                                             , { ename : "송행정", depart : "행팀", status : "B", height: 195 }
                                             , { ename : "나법무", depart : "법무팀", status : "C", height: 175} 
                                            ])
db.employee.find()


2. Insert 동작의 특징

    1) Collection 생성 : Collection이 존재하지 않으면, Insert 동작이 Collection 을 생성합니다.
    2) _id : Collection에 저장된 각 문서에는 Primary key 역할을하는 고유 한 _id 필드가 필요합니다. _id 필드를 생략하면 위와 같이 ObjectId 타입으로 키가 자동으로 생성됩니다.
    3) update 를 수행하는 명령어의 upsert : true 옵션을 주면 Insert 동작을 수행합니다.    
  • update - upsert : true 옵션을 주었을 때
  • updateOne - upsert : true 옵션을 주었을 때
  • updateMany - upsert : true 옵션을 주었을 때
  • findAndModify - upsert : true 옵션을 주었을 때
  • findAndUpdate - upsert : true 옵션을 주었을 때
  • findAndReplace - upsert : true 옵션을 주었을 때

4) 원자성 : MongoDB의 쓰기동작은 단일 Document에 대해서는 원자성을 가지고 있으나 Multi Document에서는 $isolated 연산자를 사용해야지만이 원자성을 가질수 있습니다. 하지만 $isolated  연산자는 sharded cluster 환경에서는 동작하지 않습니다.

5)   writeConcern  : MongoDB는 쓰기 행위를 통지 받을수 있는 레벨을 정하는 옵션이 있습니다. 아래 링크 참조(https://docs.mongodb.com/manual/reference/write-concern/

3. 다양한 Insert 방법
  위에서 소개된 Insert 방법 말고 데이터를 Insert할수 있는 명령어로는 save와 bulkWrite가 있습니다.

  save 명령어는 document가 존재하면 update, 존재하지 않으면 insert 입니다. update명령어와 차이점은 Document단위로 데이터를 변경합니다. document 단위로 데이터를 변경하는 것은 save 가 효율적이지만, 필드 단위로 변경하는 경우에는 update 문이 더 효율적입니다.
db.employee.save({ ename : "김식당", depart : "자재팀", status : "B", height: 177 } )
 bulkWrite명령어는 쓰기명령어에 해당하는 모든 작업(쓰기, 수정, 삭제)을 수행할 수 있습니다. 
db.collection.bulkWrite( [ { insertOne : { "document" : { ename : "김벌크", depart : "영업팀", status : "B", height: 197 } } } ] )

자바스크립트 for 문을 이용하여 Insert가 가능합니다.
var heightSize = 170
for(var i = 0 ; i < 3 ; i++){
    db.employee.insertOne({ ename : "김포문" + i, depart : "영업팀", status : "B", height: 160 + i * 3 } )
}
 



4. Autoincrement Id 만들어 입력하기

관계형 데이터베이스에서는 대부분 연속적인 자동 증가값을 구현할수 있는 방법을 제공합니다. MongoDB에서는 그러한 기능이 기본적으로 제공되지는 않지만 다음과 같이 함수를 이용하여 직접 생성할 수 있습니다.

function seq_no(name){
    var ret  = db.seq_no.findAndModify({query : {_id : name},
                                                                    update :{$inc:{next:1}},
                                                                    "new":true, upsert:true});
    return ret.next;
}
db.ord_no.insert({_id:seq_no("ord_no"), name: "스타워즈레고"})
db.ord_no.insert({_id:seq_no("ord_no"), name:"닌자고레고"})
db.ord_no.find()



728x90