본문 바로가기

KERT/HackHeat

NoSQL 개념과 MongoDB 기본 문법

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" } })

 

'KERT > HackHeat' 카테고리의 다른 글

Command Injection  (0) 2023.08.14
NoSQL Injection  (0) 2023.07.27
SQL Injection  (0) 2023.07.21
DBMS  (0) 2023.07.21
ClientSide: XSS  (0) 2023.07.16