본문 바로가기
개발/DB

[mongoDB] 2. Databases, Collections, Documents

by 달사쿠 2020. 8. 20.
반응형

 

[mongoDB] 1. 시작하기 (소개, SQL vs NoSQL, 장단점, 용어, 설치) 의 mongoDB 특징에서 언급했지만, 기본적으로 mongoDB는 Document-oriented 스토리지 입니다.

구체적으로 document들이 모여 collection을 이루고, 이 collection들의 집합이 Database를 이루게 됩니다. 이러한 구조를 RDB랑 맵핑시켜 생각해본다면 다음과 같습니다.

https://beginnersbook.com/2017/09/mapping-relational-databases-to-mongodb/

위 그림에서 나와있는 Databases, Collections, Documents가 주로 사용되는 용어이며 앞으로 순서대로 다뤄볼 것입니다. 본 포스트에서는 mongoDB 공식 manual에 소개된 순서대로 진행할 예정이고, Database와 Collection, Document를 소개하겠습니다.


Databases and Collections

mongoDB는 collections 안에 BSON형식의 documents가 저장되어 있습니다. 이때 위의 mongoDB 구조에서 소개한 그림과 같이 collections는 databases 안에 있습니다.

 

https://docs.mongodb.com/manual/core/databases-and-collections/

Databases

위에서 언급했듯 document들을 담고있는 collections를 databases가 가지고있는 형태입니다.

먼저 mongo shell에서 database를 사용하기 위해서는 use <db>를 실행하면 됩니다. 이때 만약 db가 없다면 새로 생성해줍니다.

use myNewDB
db.myNewCollection1.insertOne( { x: 1 } )

위의 예시에서 insertOne() 오퍼레이션은 database와 collection이 없다면, database인 myNewDB과 collection인 myNewCollection1을 생성해줍니다. 이때 주의해야할 것은 database와 collection 명은 mongoDB naming 규칙을 따릅니다.

 

Collections

collections는 documents를 저장하고 있으며, RDB의 table과 유사한 개념입니다.

collection을 생성해보겠습니다. collection이 없는 경우, mongoDB는 생성할 때 해당 collection에 대한 첫번째 데이터를 저장할 것입니다.

db.myNewCollections2.insertOne({x: 1})
db.myNewConllection3.createIndex({y: 1})

collection이 없다면, mongoDB는 생성할 때 해당 collection에 대한 첫번째 데이터를 저장할 것입니다. insertOne()createIndex() 오퍼레이션 모두 해당 컬렉션이 존재하지 않으면 collection을 생성합니다.

 

만약 collection을 좀더 명시적으로 생성하고 싶다면 db.createCollection() 메소드를 사용하면 됩니다. 이 메소드는 maximum size와 같은 다양한 옵션들을 사용하여 collection을 생성합니다. 옵션을 지정하지 않는다면, 굳이 명시적으로 collection을 생성할 필요가 없습니다.

 


Documents

mongoDB는 데이터 레코드를 BSON documents로 저장합니다. BSON은 JSON을 binary로 표현한 것으로, JSON에 비해 더 많은 데이터 타입을 포함하고 있습니다. BSON의 스펙과 데이터타입에 대해 좀 더 구체적을 알고 싶다면 http://bsonspec.org을 보시면 될 것 같습니다.

 

BSON (Binary JSON) Serialization

BSON [bee · sahn], short for Bin­ary JSON, is a bin­ary-en­coded seri­al­iz­a­tion of JSON-like doc­u­ments. Like JSON, BSON sup­ports the em­bed­ding of doc­u­ments and ar­rays with­in oth­er doc­u­ments and ar­rays. BSON also con­ta

bsonspec.org

field와 value

https://docs.mongodb.com/manual/core/document/

documents는 field와 value 쌍으로 이루어져 있습니다.

 

field명의 경우,  무조건 string이어야 하며, null값으로 세팅될 수 없습니다. 또한 _id의 경우 primary key로 사용됩니다. _id는 반드시 collection 내에서 unique하고 immutable합니다. 

 

value는 BSON의 데이터 타입에 포함되는 것이라면 어떠한 것도 될 수 있습니다. 다른 documents, arrays, documents의 array 등등.. 그 어떤 것도 될 수 있습니다. 예를 들어봅시다.

var mydoc = {
               _id: ObjectId("5099803df3f4948bd2f98391"),
               name: { first: "Alan", last: "Turing" },
               birth: new Date('Jun 23, 1912'),
               death: new Date('Jun 07, 1954'),
               contribs: [ "Turing machine", "Turing test", "Turingery" ],
               views : NumberLong(1250000)
            }

_id는 ObjectId를 value로 갖고 있으며, name은 name과 first를 field로 가지는 내장 document를 value로 갖고 있습니다. birth와 death는 Date 타입의 value를 갖고 있고 contribs는 string array를 value로 갖고 있습니다.

 

Dot(.) Notation

document에서 점(.) 표기법을 사용하여 array의 원소에 접근하거나 내장 document의 field에 접근할 수 있습니다. 예를 들어보겠습니다.

{
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   name: { first: "Alan", last: "Turing" }
   ...
}

위의 예시에서 contribs 필드의 array 3번째 원소에 접근할 때 contribs.2 (index의 시작은 0부터) 라고 표기할 수 있습니다.

name 필드의 last 필드 값에 접근하고 싶다면 name.last 로 표기합니다. 

 

Document Limitations

document는 몇가지 제약이 있습니다.

  • BSON document의 사이즈는 1 megabytes가 맥시멈입니다. 
  • document field의 순서가 mongoDB 내부적으로 유지됩니다. 단 예외적으로, _id field는 항상 첫번째이고 field 명을 포함한 업데이트는 field의 순서가 내부적으로 재배열됩니다.

구체적인 부분은 https://docs.mongodb.com/manual/core/document/ 를 참고하세요.


지금까지 Databases, Collections, Documents에 대해서 소개해드렸습니다. 다음 포스팅에서는 mongoDB의 CRUD에 대해서 포스팅할 예정입니다. 본 포스팅에서 소개한 용어 이외에, mongoDB에서 사용되는 용어에 대해서 좀 더 자세히 알고싶다면 Reference > Glossary 를 참고하시면 될 것 같습니다.

 

Glossary — MongoDB Manual

A combination of query predicate, sort, and projection. For the query predicate, only the structure of the predicate, including the field names, are significant; the values in the query predicate are insignificant. As such, a query predicate { type: 'food'

docs.mongodb.com

 

반응형

댓글