일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 확장 유클리드 알고리즘
- 포너블
- 마감임박
- 백엔드
- 한국산업인력공단
- function scope
- 동적타이핑
- Writeup
- 호이스팅
- 백엔드입문
- 개인정보안전성
- 웹 프레임워크
- 무료교육
- 곱셈 암호
- 모듈러 연산
- package.json
- 개인정보보호위원회
- 디오판투스 알고리즘
- 개인정보보호
- 유클리드_알고리즘
- 한국정보보호산업협회기자단
- 국가인적자원개발컨소시엄
- node.js
- 한국정보보호산업협회
- package-lock.json
- 가명정보처리
- arrow function
- 덧셈 암호
- pwnable.tw
- 개인정보보호교육
- Today
- Total
짱짱해커가 되고 싶은 나
mongoDB - CRUD 본문
* NoSQL
NoSQL은 고정된 테이블이 없다. 테이블 대신 컬렉션이라는 용어를 사용하기는 하지만 컬럼을 따로 정의하지 않는다.
예를 들어, MySQL은 users테이블에 name, age 등의 컬럼과 자료형, 옵션 등을 정의하지만 몽고디비는 그냥 users 컬렉션을 만드는게 끝이다. 그리고 users 컬렉션에는 어떤 데이터든 자유롭게 들어갈 수 있다.
즉, 규칙성이 존재하지 않는 것이다.
또한 SQL 수준의 트랜젝션이 없다. 따라서 데이터의 일관성 문제가 생길 수 있다.
SQL | noSQL |
m규칙적인 데이터 입력 테이블 간 JOIN o 트랜젝션 o 안전성, 일관성 테이블, 로우, 칼럼 |
자유로운 데이터 입력 컬렉션 간 JOIN x 트랜젝션 x 확장성, 가용성 컬렉션, 다큐먼트, 필드 |
noSQL은 JOIN기능과 트랜젝션 기능은 없지만 확장성과 가용성이 좋다. (noSQL을 사용하는 이유)
데이터의 입력에 규칙성이 없기 때문에 일관성의 보장 기능은 약하지만 그만큼 빠르게 데이터를 입력하고 쉽게 분산할 수 있다.
많은 기업에서 SQL과 noSQL을 동시에 사용하고 있다고 한다.
항공사를 예를 들었을 때 SQL은 비행기 표에 관한 정보를 다룰 때, 즉 예약 시스템 같은 부분에서 사용하고 noSQL은 빅데이터, 메시징, 세션 관리 등 확장성과 가용성이 중요한 부분에 사용할 수 있다.
* mongoDB
mongoDB는 noSQL의 대표적인 DB로 볼 수 있다.
몽고 디비는 관리 도구로 컴퍼스를 제공하는데 컴퍼스 사용법은 따로 작성하지 않겠다.
먼저 mongoDB를 설치한 폴더의 위치로 이동하고 mongod를 실행시킨다.
mongod를 실행시킨 후 다른 cmd 창에서 mongo 위치에서 mongo를 누르면 몽고디비 프롬프트에 접속할 수 있다.
현재 누구나 몽고디비에 접속할 수 있기 때문에 관리자 계정을 추가한다.
계정을 생성할 때는 db.createUser()로 생성할 수 있다.
user: 사용자 이름, pwd: 사용할 비밀번호, roles: 권한
이렇게 계정을 만들었으면 mongod를 종료하고 mongod --auth로 접속한다.
mongod --auth는 로그인을 하는 옵션이다.
그리고 mongo 콘솔을 종료한 뒤 mongo admin -u 이름 -p 비밀번호 로 앞서 만든 계정으로 로그인한다.
use DB이름 명령어를 통해 데이터베이스를 생성할 수 있다.
그런데 show dbs 명령어로 만들어진 데이터베이스들을 확인하려 했는데 앞서 만든 nodejs가 없다.
그 이유는 데이터를 최소 한 개 이상 넣어야 목록에 표시되기 때문이다.
현재 사용중인 DB를 확인하는 명령어는 db다.
nodejs에 아무런 데이터도 넣지 않아서 목록에는 존재하지 않지만 현재 사용중인 것을 확인할 수 있다.
다큐먼트를 넣는 순간 컬렉션도 자동으로 생성되기 때문에 컬렉션은 따로 생성할 필요가 없다.
컬렉션을 직접 생성하는 명령어는 db.createCollection()이다.
1. CREATE
mongoDB는 컬렉션에 컬럼을 정의하지 않아도 된다는 장점이 있지만 그 안에 무엇이 들어올지 모른다는 단점이 존재한다. MySQL과 자료형이 조금 다른데 기본적으로 js 문법을 사용하기 때문에 js의 자료형을 따른다. 하지만 추가로 몇 개의 자료형이 더 있다. Binary Data, ObjectId, Int, Long, Decimal, Timestamp, JavaScript 등이 있다. (ObjectId, Binary Data, Timestamp가 주로 사용됨) 그리고 mongoDB는 undefined와 symbol 자료형은 사용하지 않는다.
db.컬렉션.save(다큐먼트); 명령어를 이용해서 다큐먼트를 생성할 수 있다.
여기서 WriteResult({"nInserted" : 1})은 다큐먼트가 한 개 생성되었다는 응답이다.
그럼 지금 입력한 다큐먼트 중 제로의 id를 얻어오자.
왜냐면 comments 컬렉션에 제로의 id를 commenter의 값으로 사용할 것이기 때문이다.
db.users.find({name: 'zero'}, {_id: 1}) 이라는 명령어를 입력하면 users 컬렉션에 이름이 zero인 다큐먼트의 ObjectId를 _id의 값으로 찾아준다.(_id는 기본적으로 가져오기 때문에 0/false로 입력해야만 가져오지 않는다.)
그리고 save 명령어로 comments 컬렉션에 zero의 id를 commenter로 갖는 다큐먼트를 생성한다.
2. READ
이제 이렇게 만든 users와 comments 컬렉션의 다큐먼트들을 확인해보자.
db.컬렉션.find({}); 명령어는 컬랙션 내의 모든 다큐먼트를 조회한다는 뜻이다.
name과 married 필드만 갖고 오고 싶으면 다음과 같이 두번째 인자에 해당 필드 : 1을 하면 된다.
즉 db.컬렉션.find({조건}, {가져올 속성}); 으로 생각해도 좋을 것 같다.
mongoDB는 js객체를 사용하기 때문에 특수한 연산자가 사용가능하다.
$gt, $gte, $glt, $lt, $lte, $ne, $or, $in 등이 있다.
$or 연산을 사용하지 않는 한 find 안의 모든 조건을 만족하는 다큐먼트만 찾는다.
$or 연산은 {$or: []} 로 사용할 수 있다.
sort 메서드를 이용해서 정렬도 가능하다.
sort({속성:1/1}) 1은 오름차순, -1은 내림차순이다.
그리고 limit 메서드와 skip 메서드도 존재한다.
3. UPDATE
update는 db.컬렉션.update({조건}, {$set: {}}); 의 형식이다.
결과에서 nMatched는 조건에 해당하는 다큐먼트 수이고 nModifed는 수정된 다큐먼트의 수다.
4. DELETE
remove명렁어로 해당하는 다큐먼트를 제거할 수 있다.
성공하면 삭제된 개수가 반환된다.