시작하며
몽고DB를 설치하고 활용하는 과정에서 GUI프로그램으로 Robo 3T를 사용하게된다. 기본적으로 파이썬 프로그래밍이나 DB를 다룰 때 사용되는 콘솔 명령어를 Robo 3T에서도 사용이 가능하지만, GUI 프로그램이므로 클릭으로도 형성이 가능한 경우가 많다.
MongoDB 데이터베이스 생성방식
비콘솔 방식
위의 사진처럼 PC서버를 연결하고 우클릭을 하면 Create Database가 나온다. 이를 클릭해서 이름을 짓고 만들 수 있다. 데이터베이스 만들 때는 이 방식을 추천한다.
무슨 에러인지는 모르겠는데 콘솔방식으로 만들면 Refresh해도 생성된 DB가 안 보인다…
콘솔 방식
설정한 서버를 우클릭하면 Create Database말고 Open Shell이 나온다. 여기서 다음과 같은 명령어를 실행하면된다.
1
use database_name
사실 위의 명령어는 특정 데이터베이스로 이동할 때 사용하는 명령어기도 하다. 없는 경우에는 생성후 이동하게된다.
MongoDB의 CRUD방식
일반적으로 데이터베이스의 기본은 CRUD라고한다.
- C : Create
- R : Read
- U : Update
- D : Delete
이 4가지를 자유자재로 다뤄야하고 효율적으로 운영하게 만드는 것이 핵심이다.
RDBMS들과 마찬가지로 NoSQL에도 CRUD를 위한 명령어가 존재한다. GUI를 통해 만드는 방법도 있지만, 그건 뭐 굳이 설명할 필요가 없으니 명령어로 설명하겠다.
Create (document, collection 생성)
MongoDB가 사용하는 데이터 저장방식은 JSON방식을 사용한다. 그래서 저장하는 내용물을 document 즉, 문서라고 부르게된다.
일반적으로 RDBMS에서는 table을 만든다고한다. NoSQL에서 테이블과 같은 역할을 하는 것이 바로 collection이다.
기존의 RDBMS에서는 테이블의 생성과 변경이 이뤄지는데, 생성에는 CREATE
, 테이블 수정에는 ALTER
를 사용했다. 하지만 NoSQL에서는 ALTER
의 역할이 필요가 없어지는데, 이유는 NoSQL은 RDBMS와 다르게 컬럼의 규격 제한이 없기 때문이다. 저장하는 document별로 컬럼 값의 변경이 가능하기 때문이다.
이제 NoSQL과 RDBMS의 문법을 비교하면서 콘솔 명령어를 설명하겠다.
RDBMS
1
2
3
4
5
6
7
CREATE TABLE emp (
id INT NOT NULL AUTO INCREMENT,
user_id VARCHAR(30),
age INT,
status CHAR(1),
PRIMARY KEY (id)
);
NoSQL (use database로 특정 db로 이동한 후로 가정)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
db.createCollection("emp")
db.createCollection("emp1", { capped: true, size: 10000})
// collection을 만들 때, 저장사이즈 크기를 고정시킬 수 있다. 옵션부여
db.emp.insertOne( { user_id: "abcd1", age: 24, status: "A" } )
db.emp.insertMany(
[
{ user_id: "abcd2", age: 26, status: "A" },
{ user_id: "abcd3", age: 18, status: "B" },
{ user_id: "bcde4", age: 46, status: "C" },
{ user_id: "abcd5", age: 33, status: "B" }
]
)
위의 명령어는 모두 같은 역할을 한다. 재밌는 점은 기존의 RDBMS는 테이블을 만들 때, 규격을 정하고 그에 맞는 데이터들만 집어넣는다. 하지만 NoSQL에서는 우선 collection을 이름만 지어서 만든다. (필요에 따라서 옵션을 부여할 수 있다.) 그리고 그 후에 넣는 컬럼들의 데이터 타입은 들어가는 데이터의 형식에 따라서 결정된다.
여기서 좀 특이한 점이라면, RDBMS에서는 명시해주는 PRIMARY KEY의 역할을 자동적으로 _id라는 변수가 맡게된다.
Read (데이터 탐색)
문법 작성
역시나 RDBMS에서 사용하는 방식과는 꽤 많이 다르다. 사실 document를 읽는 문법은 RDBMS보다 직관력이 많이 떨어지고 손이 많이 간다고 생각된다. 이유는 비교 문법때문인데, 같은 탐색문을 이번에도 적어보겠다.
RDBMS
1
SELECT user_id, age FROM emp WHERE age > 30;
NoSQL
1
2
3
4
db.emp.find(
{ age: { $gt: 30 } },
{ user_id: 1, age: 1 }
)
아마 문법으로 보고 물음표 한 3개 정도 뜨면 정상인거다. 직관력이 많이 떨어진다는 이유는 바로 비교기호를 사용하지 않는다는 점이다. 마치 HTML문서에 작성하듯이 코드를 활용해서 비교문을 작성한다.
그리고 역시나 문법이므로 작성순서가 존재하는데, 앞에 나오는 중괄호는 조건문의 역할이고 뒤에 나오는 중괄호는 옵션이라고 부르고 탐색하고자 하는 컬럼을 1로 명시해준다. 만약 모든 데이터를 탐색한다면, 조건만 적거나, 내용이 빈 중괄호만 작성하면된다.
이때, _id변수는 0으로 지정하지 않는 이상 무조건 데이터를 표시한다. 위에서 말했듯이 _id의 역할은 데이터를 구분해주는 역할을 하게 된다.
문법 종류
데이터 탐색을 할 때 사용하는 문법이 까다롭다는 것은 예시를 통해서 알았으니 이제 사용 문법을 좀 정리할 필요가 있다.
- $eq : =
- $in : 해당 데이터를 갖는 자료
- $gt : >
- $gte : >=
- $lt : <
- $lte : <=
- $ne : !=
- $nin : 해당 데이터가 없는 자료
- db.collection_name.distinct(“column_name”) : 특정 컬럼의 종류를 반환
AND문법은 단순히 콤마(,)로 이어서 작성하면 되지만 OR은 형식이 존재한다.
1
2
3
db.emp.find(
{ $or: [ { status: "A" }, { age: 20 } ]}
)
Update (데이터 수정)
데이터 수정도 역시나 데이터베이스에서는 중요하다. 기존에 RDBMS를 좀 공부해 본 사람이라면 대충 느낌이 오겠지만, 데이터 수정에서는 조건이 활용되므로 탐색과정에서 활용한 조건 문법들을 활용해야한다.
RDBMS
1
UPDATE emp SET status = "B" WHERE age > 40;
NoSQL
1
2
3
4
5
// Many는 One으로 바꾸면 데이터 1개만 찾는다.
db.emp.updateMany(
{ age: { $gt: 40 } },
{ $set: { status: "B" } }
)
이거 보면 진짜 NoSQL은 $를 좋아하는 것 같다. 그리고 마치 굉장히 불편해 보인다고 생각이 들지만 자세히보면 꼭 그렇지도 않다. 필요한 묶음은 모두 같은 중괄호에 묶어버리면 되기 때문이다. 그래서 익숙해지면 생각보다 눈에 잘 들어오게 카테고리화가 된다.
Delete
삭제 구문은 크게 어렵지않다. 역시나 RDBMS에서도 특정 조건으로 삭제가 가능한 것처럼 여기서도 조건문으로 활용하거나, { }로 작성해서 모든 데이터 삭제가 가능하다.
RDBMS
1
DELETE FROM emp WHERE status = "A";
NoSQL
1
2
3
4
// One이면 데이터 1개만 삭제
db.emp.deleteMany(
{ status: "A" }
)
Comments powered by Disqus.