Non-Relational DBMS (NRDBMS, NoSQL(Not Only SQL)
- NoSQL은 SQL를 사용하지 않고 복잡하지 않은 데이터를 저장해 단순 검색 및 추가 검색 작업을 위해 매우 최적화된 저장 공간
- 그에 비해, RDMBS 는 용량이 많이 필요하다.
- NoSQL 또한 이용자의 입력값을 통해 동적으로 쿼리를 생성해 데이터를 저장하기 때문에 sql injection 문제 발생
- NoSQL: Redis, Dynamo, CouchDB, MongoDB 등 다양한 DBMS가 존재
- RDBMS: SQL (데이터를 저장하는 문법이 한 가지)
- NoSQL 은 각각의 구조와 사용 문법을 익혀야한다는 단점이 있다.
MongoDB
MongoDB는 JSON 형태인 도큐먼트(Document)를 저장한다.
- 스키마를 따로 정의하지 않아 각 컬렉션(Collection)에 대한 정의가 필요하지 않습니다.
- JSON 형식으로 쿼리를 작성할 수 있습니다.
- _id 필드가 Primary Key 역할을 합니다.
컬렉션이란? 데이터베이스의 하위에 속하는 개념으로, RDBMS 에서의 '테이블' 과 비슷하다
Ex) MongoDB에서 데이터를 삽입하고, 조회하는 쿼리
$ mongo
> db.user.insert({uid: 'admin', upw: 'secretpassword'})
WriteResult({ "nInserted" : 1 })
> db.user.find({uid: 'admin'})
{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }
Ex) status의 값이 "A"이고, qty의 값이 30보다 작은 데이터를 조회하는 쿼리
DBMS |
Query |
RDBMS |
SELECT * FROM inventory WHERE status = "A" and qty < 30; |
MongoDB |
db.inventory.find( { $and: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) |
MongoDB 는 $ 문자를 통해 연산자를 사용할 수 있다.
연산자
Comparison
$eq |
지정된 값과 같은 값을 찾습니다. (equal) |
$in |
배열 안의 값들과 일치하는 값을 찾습니다. (in) |
$ne |
지정된 값과 같지 않은 값을 찾습니다. (not equal) |
$nin |
배열 안의 값들과 일치하지 않는 값을 찾습니다. (not in) |
Logical
$and |
논리적 AND, 각각의 쿼리를 모두 만족하는 문서가 반환됩니다. |
$not |
쿼리 식의 효과를 반전시킵니다. 쿼리 식과 일치하지 않는 문서를 반환합니다. |
$nor |
논리적 NOR, 각각의 쿼리를 모두 만족하지 않는 문서가 반환됩니다. |
$or |
논리적 OR, 각각의 쿼리 중 하나 이상 만족하는 문서가 반환됩니다. |
Element
$exists |
지정된 필드가 있는 문서를 찾습니다. |
$type |
지정된 필드가 지정된 유형인 문서를 선택합니다. |
Evaluation
$expr |
쿼리 언어 내에서 집계 식을 사용할 수 있습니다. |
$regex |
지정된 정규식과 일치하는 문서를 선택합니다. |
$text |
지정된 텍스트를 검색합니다. |
기본 문법 (SELECT, INSERT, DELETE, UPDATE)
SELECT
SQL |
MongoDB |
SELECT * FROM account; |
db.account.find() |
SELECT * FROM account WHERE user_id="admin"; |
db.account.find({user_id: "admin"}) |
SELECT user_idx FROM account WHERE user_id="admin"; |
db.account.find({ user_id: "admin" },{ user_idx:1, _id:0 }) |
INSERT
SQL |
MongoDB |
INSERT INTO account(user_id,user_pw,) VALUES ("guest", "guest"); |
db.account.insert({user_id: "guest",user_pw: "guest"}) |
DELETE
SQL |
MongoDB |
DELETE FROM account; |
db.account.remove() |
DELETE FROM account WHERE user_id="guest"; |
db.account.remove( {user_id: "guest"} ) |
UPDATE
SQL |
MongoDB |
UPDATE account SET user_id="guest2" WHERE user_idx=2; |
db.account.update({user_idx: 2},{ $set: { user_id: "guest2" } }) |