MongoDB 기본적인 쉘, 데이터 타입, SQL과 비교

송윤주·2024년 4월 22일
0

데이터베이스

목록 보기
3/13

지난 포스팅과 이어서 계속 몽고디비에 대해서 학습해보자

기본적인 쉘

데이터 표현

MongoDB에서 데이터는 JSON과 유사한 형식인 BSON(Binary JSON)을 사용해 저장된다. 예를들어 m = {ename: "smith"}는 ename이라는 필드에 "smith"라는 문자열 값을 가지는 문서를 나타낸다. n = {empno: 1101}는 empno 필드에 1101이라는 숫자 값을 저장한다.


컬렉션 생성 및 데이터 저장

db.things.save(m)db.things.save(n)은 things라는 컬렉션에 m과 n 문서를 저장한다. save() 메소드는 주어진 _id를 가진 문서가 이미 존재하면 갱신(update)하고, 존재하지 않으면 새로운 문서를 추가(insert)한다.


데이터 검색, 입력, 갱신, 삭제

검색
db.things.find()는 things 컬렉션에 있는 모든 문서를 검색합니다.
findOne() 메소드는 조건에 맞는 첫 번째 문서를 반환한다. 예를 들어, db.things.findOne({empno: 1101})은 empno가 1101인 문서 한 개를 반환한다.

입력
db.things.insert({empno: 1102, ename: "king"})는 새로운 문서를 things 컬렉션에 추가한다. insert()는 주로 새 문서를 콜렉션에 추가할 때 사용된다.

갱신
db.things.update({empno: 1101}, n)는 empno가 1101인 문서를 n 문서로 갱신한다. 갱신은 두 개의 주요 매개변수를 필요로 한다:
첫 번째는 갱신하려는 문서를 찾는 쿼리, 두 번째는 갱신할 내용이다.

$set 연산자를 사용한 갱신 예:
db.things.update({empno: 1102}, {$set: {dept: "human"}})는 empno가 1102인 문서에 dept 필드를 추가하거나 변경한다.

삭제
db.things.remove({ename: "smith"})는 ename이 "smith"인 모든 문서를 삭제한다.
db.things.remove({})는 things 컬렉션의 모든 문서를 삭제한다.


차이점: save, insert, update
Insert: 콜렉션에 새 문서를 추가할 때 사용된다. 문서가 존재하지 않는 경우에만 사용된다.
Update: 기존 문서의 특정 필드를 수정할 때 사용된다. $set 등의 연산자와 함께 사용하여 특정 필드만 수정할 수 있다.
Save: 문서의 _id 필드를 기준으로, 해당 _id를 가진 문서가 존재하면 전체 문서를 갱신하고, 없으면 새로운 문서를 추가한다. 필드 단위가 아닌 전체 문서 단위의 갱신이 특징이다.




데이터 타입과 연산자

데이터 타입

JSON과 BSON

  1. JSON (JavaScript Object Notation)

    • JSON은 데이터를 저장하고 구조화하는 경량의 데이터 교환 형식이다.
    • MongoDB에서는 JSON 형식을 사용하여 데이터를 표현하고 이를 문서(document)라고 한다. 이 문서는 관계형 데이터베이스의 행(row)과 유사하다.
    • JSON 문서는 항상 중괄호 {} 안에 표현되며, 키-값 쌍으로 데이터를 저장한다.
  2. BSON (Binary JSON)

    • BSON은 JSON의 이진 형식으로, MongoDB에서 데이터를 저장하고 네트워크 전송을 할 때 사용한다.
    • BSON 형식은 JSON과 비슷하지만, 더 많은 데이터 타입을 지원하고, 데이터 접근이 빠르다는 장점이 있다.
    • BSON은 문서의 크기를 늘리지만, 처리 속도와 유연성에서 이점을 제공한다.

따라서 MongoDB를 사용할 때 데이터는 개발자에게는 JSON형태로 보이지만 실제로는 서버 내부에서 BSON형태로 저장되고 처리된다.

주요 데이터 타입

  1. ObjectId 타입

    • MongoDB 문서는 기본적으로 고유한 _id 필드를 갖는다. 이 필드는 ObjectId 타입을 사용하여 자동 생성된다.
    • ObjectId는 12바이트의 바이너리 데이터로, 생성 시간의 타임스탬프, 머신 아이디, 프로세스 아이디, 그리고 순차적인 카운터를 포함한다.
    • ObjectId는 각 문서의 고유성을 보장한다.
  2. Date 타입

    • MongoDB는 날짜와 시간을 저장하기 위해 Date 타입을 제공한다.
    • new Date() 함수를 사용하여 현재 날짜와 시간을 생성할 수 있다.
    • 저장된 Date 객체는 .getMonth(), .getFullYear() 등의 메소드를 사용하여 다양한 날짜 정보를 추출할 수 있다.
  3. Timestamp 타입

    • MongoDB의 Timestamp 타입은 내부적으로 복제와 같은 목적으로 사용되는 특별한 타입이다.
    • Timestamp는 64비트 값으로, 주로 몽고DB의 내부 운영에 사용되며, 복제 프로세스에서 데이터의 버전 관리에 쓰인다.
  4. 배열 데이터 타입

    • MongoDB에서 배열은 여러 값을 순서대로 저장할 수 있도록 해준다.
    • 배열은 []를 사용하여 표현되며, 문서 내에서 배열 형태로 데이터를 저장할 수 있다.
    • 예: db.things.save({empno: 1103, ename: "test", salaries: [1000, 2000]})
    • 배열 데이터에 접근하려면, .find()로 문서를 조회 후, 반복문을 사용하여 각 요소에 접근할 수 있다.

명령어 사용 예

  • 배열 데이터 저장 및 조회:

    // 배열에 데이터 저장
    for(var n = 1103; n <= 1120; n++) {
      db.things.save({empno: n, ename: "test", sa1: 1000});
    }
    
    // 배열 데이터 출력
    var cursor = db.things.find();
    while(cursor.hasNext()) {
      printjson(cursor.next());
    }
  • 날짜 데이터 타입 사용:

    var x = new Date();
    console.log(x.toISOString()); // 현재 날짜를 ISO 문자열 형태로 출력
    
    var d = ISODate();
    console.log(d.getMonth()); // 현재 월 정보 출력
  • 타임스탬프

    데이터 타입 사용:

    db.foo.insert({ x : 1, y : new Timestamp() });
    var result = db.foo.find({}, {_id : 0});
    printjson(result.toArray());


연산자

MongoDB에서 사용하는 다양한 연산자들은 데이터를 조회하고 조작할 때 매우 유용하게 사용된다. 여기에는 비교 연산자, 불린 연산자, 산술 연산자, 그리고 문자열 연산자 등이 포함된다. 이들 각각의 연산자는 특정 조건을 충족하는 데이터를 필터링하거나, 데이터를 변형하는 데 사용된다.

비교연산자 & Boolean 연산자

  1. 비교 연산자

    • $lt (less than, 미만): 첫 번째 값이 두 번째 값보다 작으면 true를 반환한다.
    • $lte (less than or equal, 이하): 첫 번째 값이 두 번째 값보다 작거나 같으면 true를 반환한다.
    • $gt (greater than, 초과): 첫 번째 값이 두 번째 값보다 크면 true를 반환한다.
    • $gte (greater than or equal, 이상): 첫 번째 값이 두 번째 값보다 크거나 같으면 true를 반환한다.
    • $ne (not equal, 같지 않음): 두 개의 값이 서로 다르면 true를 반환한다.
    • $eq (equal, 같음): 두 개의 값이 동일하면 true를 반환한다.

    예시:

    db.collection.find({ age: { $lt: 30 } }) // 나이가 30 미만인 문서 조회
  2. Boolean 연산자

    • $and: 제공된 모든 조건이 참일 때만 참을 반환한다.
    • $or: 제공된 조건 중 하나라도 참이면 참을 반환한다.
    • $not: 지정된 조건의 반대 결과를 반환한다.

    예시:

    db.collection.find({ $and: [{ age: { $gt: 20 } }, { age: { $lt: 30 } }] }) // 나이가 20 초과 30 미만인 문서 조회

산술 연산자

  • $add: 두 수를 더한다.
  • $subtract: 첫 번째 값에서 두 번째 값을 뺀다.
  • $multiply: 두 수를 곱한다.
  • $divide: 첫 번째 값을 두 번째 값으로 나눈다.
  • $mod: 첫 번째 값을 두 번째 값으로 나눈 나머지를 반환한다.

문자열 연산자

  • $toUpper: 문자열을 대문자로 변환한다.
  • $toLower: 문자열을 소문자로 변환한다.

예시:

db.collection.aggregate([
  { $project: { upperName: { $toUpper: "$name" } } } // 이름 필드를 대문자로 변환
])

이 연산자들을 활용하면 MongoDB에서 데이터를 더 유연하고 효율적으로 다룰 수 있다. 다양한 쿼리 조합을 통해 복잡한 데이터 요구 사항을 충족시킬 수 있으며, 데이터 변형도 쉽게 수행할 수 있다.




SQL과 비교

데이터 정의 (DDL - Data Definition Language)

  • 테이블 생성 (Create Table)

    • SQL: CREATE TABLE members (mem_no VARCHAR(30), age NUMBER, type CHAR(1), PRIMARY KEY (mem_no));
    • MongoDB: MongoDB는 스키마가 고정되어 있지 않으므로 별도의 테이블 생성 명령어가 필요 없다. 컬렉션 생성은 db.createCollection("members") 명령어로 진행할 수 있으나, 대부분의 경우 컬렉션은 문서 삽입 시 자동으로 생성된다.
  • 테이블 구조 변경 (Alter Table)

    • SQL: ALTER TABLE members ADD regist_date DATE; / ALTER TABLE members DROP COLUMN regist_date;
    • MongoDB: MongoDB는 스키마가 유동적이므로, 컬럼을 추가하거나 삭제하는 명령어가 필요 없다. 문서에 필드를 추가하거나 생략하는 것만으로 충분하다.
  • 인덱스 생성 및 삭제 (Create & Drop Index)

    • SQL: CREATE INDEX i_members_type ON members(type); / DROP INDEX i_members_type;
    • MongoDB: db.members.createIndex({type: 1}); / db.members.dropIndex("i_members_type");

데이터 조작 (DML - Data Manipulation Language)

  • 레코드 삽입 (Insert Records)

    • SQL: INSERT INTO members (Mem_no, Age, Type) VALUES ('T20130102', 35, 'GOLD');
    • MongoDB: db.members.insert({_id: ObjectId("..."), mem_no: 'T20130102', age: 35, type: 'GOLD'});
  • 레코드 갱신 (Update Records)

    • SQL: UPDATE members SET type = 'GOLD' WHERE age > 45;

    • MongoDB: db.members.update({age: {$gt: 45}}, {$set: {type: 'GOLD'}}, {multi: true});

    • 여기서 SQL에서는 UPDATE 명령어를 사용하고, MongoDB에서는 $gt (greater than) 비교 연산자와 $set 연산자를 사용한다. {multi: true} 옵션을 추가하여 여러 문서를 업데이트한다.

    • SQL: UPDATE members SET age = age + 3 WHERE type = 'ACE';

    • MongoDB: db.members.update({type: 'ACE'}, {$inc: {age: 3}}, {multi: true});

    • 이 경우, SQL에서는 연산자를 직접 사용하고, MongoDB에서는 $inc (increment) 연산자를 사용하여 age 필드를 증가시킨다.

데이터 조회 (SELECT Statements)

  1. 기본 조회 및 WHERE 절 사용

    • SQL: SELECT * FROM members WHERE mem_no LIKE '%2013%';
    • MongoDB: db.members.find({mem_no: /2013/})
      • 여기서 SQL의 LIKE 연산자는 MongoDB에서 정규 표현식을 사용한다.
  2. 정렬 (Order By)

    • SQL: SELECT * FROM members WHERE type = 'ACE' ORDER BY mem_no ASC;
    • MongoDB: db.members.find({type: 'ACE'}).sort({mem_no: 1})
      • MongoDB에서 .sort({field: 1})는 오름차순, .sort({field: -1})는 내림차순 정렬을 의미한다.
  3. 개수 조회 (Count)

    • SQL: SELECT COUNT(*) FROM members;
    • MongoDB: db.members.count() 또는 db.members.find().count()
      • MongoDB에서는 .count() 메소드로 문서의 개수를 조회한다.
  4. 고유 값 조회 (Distinct)

    • SQL: SELECT DISTINCT type FROM members;
    • MongoDB: db.members.distinct("type")
      • MongoDB의 .distinct() 메소드는 주어진 필드의 모든 고유 값들을 배열로 반환한다.
  5. 조건부 조회

    • SQL: SELECT * FROM members WHERE type = 'ACE' AND age = 49;
    • MongoDB: db.members.find({type: 'ACE', age: 49})
      • MongoDB에서는 쿼리 문서 내에 여러 조건을 동시에 명시하여 조건부 조회를 수행할 수 있다.
  6. 복합 조건 조회 (AND, OR)

    • SQL: SELECT * FROM members WHERE type = 'ACE' OR age = 49;
    • MongoDB: db.members.find({$or: [{type: 'ACE'}, {age: 49}]})
      • MongoDB에서는 $or 연산자를 사용하여 여러 조건 중 하나라도 참이면 문서를 반환한다.
  7. 범위 조건 조회 (Greater Than, Less Than)

    • SQL: SELECT * FROM members WHERE age > 45;
    • MongoDB: db.members.find({age: {$gt: 45}})
      • MongoDB에서는 $gt (greater than), $lt (less than), $gte (greater than or equal to), $lte (less than or equal to)와 같은 연산자를 사용하여 범위 조건을 명시한다.
  8. 한 개의 문서만 조회

    • SQL: SELECT * FROM members WHERE rownum = 1;
    • MongoDB: db.members.findOne()
      • MongoDB의 .findOne() 메소드는 조건에 맞는 첫 번째 문서 하나만 반환한다.


profile
모두가 정보를 습득할 수 있도록 냠냠쩝쩝 먹어보는 공간

0개의 댓글