[MongoDB] 강좌 2편: Database/Collection/Document 생성·제거


이번 강좌에서는 Database, Collection, Document 를 생성하는 명령어와 제거하는 명령어를 배워보도록 하겠습니다. 이 세가지 키워드의 관계는 아래 이미지와 같습니다. 이 단어들이 생소하신분은 전 강좌를 읽어주세요.

ffff

Database 생성: use

use DATABASE_NAME 명령어를 통하여 Database를 생성 할 수 있습니다.
생성 후, 생성된 데이터베이스를사용하게 되구요,  데이터베이스가 이미 존재하는 경우엔 현존하는 데이터베이스를 사용합니다.

예제: mongodb_tutorial 이라는 데이터베이스를 생성합니다.

> use mongodb_tutorial
switched to db mongodb_tutorial

현재 사용중인 데이터베이스를 확인하려면 db 명령어를 입력하세요.

> db
mongodb_tutorial

내가 만든 데이터베이스 리스트들을 확인하려면 show dbs 명령어를 입력하세요.

> show dbs
local  0.000GB

엥?! 방금 만든 mongodb_tutorial 이 없죠?
리스트에서 방금 만든 데이터베이스를 보려면 최소 한개의 Document를 추가해야합니다.

> db.book.insert({"name": "MongoDB Tutorial", "author": "velopert"});

WriteResult({ "nInserted" : 1 })
> show dbs
local             0.000GB
mongodb_tutorial  0.000GB

* 여기서 book 은 Collection 입니다. 따로 Collection 을 미리 생성하지 않아도
위처럼 명령어를 작성하는데 차질이 없습니다.

Database 제거: db.dropDatabase()

Database를 제거할땐 db.dropDatabase() 명령어를 사용합니다.

이 명령어를 사용하기 전, use DATABASE_NAME 으로 삭제하고자 하는 데이터베이스를 선택해줘야합니다.

예제: mongodb_tutorial 데이터베이스를 제거합니다.

> use mongodb_tutorial
switched to db mongodb_tutorial
> db.dropDatabase();
{ "dropped" : "mongodb_tutorial", "ok" : 1 }

 

Collection 생성: db.createCollection()

Collection을 생성할때는 db.createCollection(name, [options]) 명령어를 사용합니다.

name 은 생성하려는 컬렉션의 이름이며 option 은 document 타입으로 구성된 해당 컬렉션의 설정값입니다.
options 매개변수는 선택적인(Optional) 매개변수로서 생략하셔도 되고, 필요에따라 사용하면 됩니다.

 

Option: 

Field Type 설명
capped Boolean 이 값을 true 로 설정하면 capped collection 을 활성화 시킵니다. Capped collection 이란, 고정된 크기(fixed size) 를 가진 컬렉션으로서, size 가 초과되면 가장 오래된 데이터를 덮어씁니다. 이 값을 true로 설정하면 size 값을 꼭 설정해야합니다.
autoIndex Boolean 이 값을 true로 설정하면, _id 필드에 index를 자동으로 생성합니다. 기본값은 false 입니다.
size number Capped collection 을 위해 해당 컬렉션의 최대 사이즈(maximum size)를 ~ bytes로 지정합니다.
max number 해당 컬렉션에 추가 할 수 있는 최대 갯수를 설정합니다.

 

예제1 : test 데이터베이스에 books 컬렉션을 옵션없이 생성합니다.

> use test
switched to db test
> db.createCollection("books")
{ "ok" : 1 }

예제2: test 데이터베이스에 articles 컬렉션을 옵션과 함께 생성합니다.

> db.createCollection("articles", {
... capped: true,
... autoIndex: true,
... size: 6142800,
... max: 10000
... })
{ "ok" : 1 }

예제3: 따로 createCollection() 메소드를 사용하지 않아도 document를 추가하면 자동으로 컬렉션이 생성됩니다.

> db.people.insert({"name": "velopert"})
WriteResult({ "nInserted" : 1 })

내가 만든 collection 리스트를 확인하려면 show collections 명령어를 입력하세요.

> show collections
articles
books
people

 

Collection 제거: db.COLLECTION_NAME.drop()

Collection을 제거 할 땐 drop()  메소드를 사용합니다.

당연히, 이 명령어를 제거하기 전, 사용 할 데이터베이스를 우선 설정해야겠죠?

예제: test 데이터베이스의 people 컬렉션을 제거합니다.

> use test
switched to db test
> show collections
articles
books
people
> db.people.drop()
true
> show collections
articles
books

 

Document 추가: db.COLLECTION_NAME.insert(document)

insert() 메소드를 사용하여 Document를 추가 할 수 있습니다.

이 명령어를 사용하기 전 데이터를 추가 할 데이터베이스를 선택해주어야합니다.

배열형식의 인자를 전달해주면 여러 다큐먼트를 동시에 추가 할 수 있습니다.

예제1: 한개의 다큐먼트를 books 컬렉션에 추가합니다.

> db.books.insert({"name": "NodeJS Guide", "author": "Velopert"})
WriteResult({ "nInserted" : 1 })

예제2:  두개의 다큐먼트를 books 컬렉션에 추가합니다. (가독성을 위해 여러줄로 작성되었습니다.)

> db.books.insert([
... {"name": "Book1", "author": "Velopert"},
... {"name": "Book2", "author": "Velopert"}
... ]);
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

컬렉션의 다큐먼트 리스트를 확인할때는 db.COLLECTION_NAME.find() 명령어를 사용하세요.

> db.books.find()
{ "_id" : ObjectId("56c08f3a4d6b67aafdeb88a3"), "name" : "MongoDB Guide", "author" : "Velopert" }
{ "_id" : ObjectId("56c08f474d6b67aafdeb88a4"), "name" : "NodeJS Guide", "author" : "Velopert" }
{ "_id" : ObjectId("56c0903d4d6b67aafdeb88a5"), "name" : "Book1", "author" : "Velopert" }
{ "_id" : ObjectId("56c0903d4d6b67aafdeb88a6"), "name" : "Book2", "author" : "Velopert" }

 

Document 제거: db.COLLECTION_NAME.remove(criteria, justOne)

remove(criteria, justOne) 메소드를 사용하여 Document를 제거 할 수 있습니다.
이 메소드에는 두가지의 매개변수가 있는데요,

parameter type 설명
*criteria document 삭제 할 데이터의 기준 값 (criteria) 입니다. 이 값이 { } 이면 컬렉션의 모든 데이터를 제거합니다.
justOne boolean 선택적(Optional) 매개변수이며 이 값이 true 면 1개 의 다큐먼트만 제거합니다. 이 매개변수가 생략되면 기본값은 false 로 서, criteria에 해당되는 모든 다큐먼트를 제거합니다.

이 강좌에선 criteria 에 부분에선 특정 field 의 값이 매칭하는 경우만 배워보도록 하겠습니다.  criteria 에 대한 자세한 내용은 다음 강좌에서 다뤄보겠습니다.

다큐먼트 추가 부분에서 find() 메소드를 잠깐 사용했었는데, 이 메소드 역시 criteria를 인수로 전달 할 수 있습니다.  다큐먼트를 제거하다가 실수를 하지 않도록 초보일땐, 제거전에는 find() 를 먼저 해서 확인하는걸 습관화하세요.

예제: books 컬렉션에서 “name”이 “Book1” 인 다큐먼트를 제거

> db.books.find({"name": "Book1"})
{ "_id" : ObjectId("56c097f94d6b67aafdeb88ac"), "name" : "Book1", "author" : "Velopert" }
> db.books.remove({"name": "Book1"})
WriteResult({ "nRemoved" : 1 })
> db.books.find()
{ "_id" : ObjectId("56c08f3a4d6b67aafdeb88a3"), "name" : "MongoDB Guide", "author" : "Velopert" }
{ "_id" : ObjectId("56c08f474d6b67aafdeb88a4"), "name" : "NodeJS Guide", "author" : "Velopert" }
{ "_id" : ObjectId("56c097f94d6b67aafdeb88ad"), "name" : "Book2", "author" : "Velopert" }

 

마무리하며..

이번 강좌에서는 MongoDB 커맨드라인 위에서 Database, Collection 그리고 Document 를 추가하고 제거하는것에 대하여 배웠습니다. 다음 강좌에서는 Document 를 Query(조회/검색) 하는 메소드인 find() 메소드에 대하여 자세히 알아보도록 하겠습니다.

  • 김동욱

    “cannot remove from a capped collection: test1.books”

    db.books.find({“name”: “Book1”}) 이 명령 실행하면 저런 에러 메세지가…

    • 제 예제에서 books 컬렉션을 capped: true 옵션으로 생성하게 했었네요.
      이 부분 수정 했습니다. 기존에 만들어진 컬렉션을 drop 하시고,
      books 컬렉션을 옵션 없이 설정 하면 문제가 해결 될거에요.

      참고로 capped collection 은 빈공간을 관리하지 않기때문에 Insert 속도가 빠른대신에 Delete 가 안된답니다.

  • DGJung

    NoSQL에서는 프라이머리 키나 RDBMS와 같은 구조 설계가 불가능한가요? 아님 신경쓰지 않아도 되는건가요?

  • GT M

    mongo를 치면 아예 연결 실패했다고 뜨는데 뭐죠 시작부터 오류가 나네요

  • GT M

    articles 콜렉션 만들때 autoIndex? 쪽에서 오류가 발ㄹ생합니다..

    • 오류 내용을 적어주세요~

      • JAE MO Ahn

        monogdb 버전 문제로 보입니다.
        – “errmsg” : “The field ‘autoIndex’ is not a valid collection option. Options…”
        하단문서를 참고하시면 될거 같습니다.
        https://docs.mongodb.com/v3.2/reference/method/db.createCollection/

        • hana

          autoIndexId: true
          -로 고치면 되네요!;)

          • 김소영

            감사합니다!!

  • moon

    veloport님 글 너무 재밌게 잘읽었습니다!

  • Sleep Joe

    진짜 몽고 입문용 공부하기에 최고의 게시물들 인거 같아요. 자세한 설명 감사합니다.
    복 받으세요~

  • Hyun Woo Jo

    createCollection 에서 생성한 db를 변경할 수 있나요?

  • Oscar won

    감사합니다 🙂
    현재 ver4.0에서는 autoIndex를 포함하면 에러가 나네요;

    • 김해동

      저도 해당 내용 찾아보니까 버전업되면서 변경된거 같아요 autoIndexId로 변경하면 됩니다.

  • kyongsoo

    한 항목에 데이터를 여러 개 입력하려면 어떻게 해야하죠? 예를 들면, 책의 다수의 저자를 입력한다던가 하는 경우에요… db.books.insert({“author”:”kim”,”lee”,”park” … }) 이런 식으로는 안되니깐요, 어떻게 해야하는지 궁금합니다. 감사합니다.

    • kyongsoo

      아- 다음 포스팅에 있었습니다. 해결됐습니다. 감사합니다.

  • 와플

    autoIndex가 안먹혀서 찾아보니 autoIndexId로 변경되었네요.