Lsiron

MongoDB 데이터? BSON? 본문

데이터베이스/MongoDB

MongoDB 데이터? BSON?

Lsiron 2024. 7. 4. 02:02

MongoDB는 다양한 데이터 타입을 지원하여 유연한 데이터 모델링을 가능하게 한다. 각 데이터 타입은 BSON(Binary JSON) 형식으로 저장된다.

 

BSON은 "Binary JSON"의 약자이다. 이는 JSON(JavaScript Object Notation) 데이터 구조를 바이너리 형식으로 인코딩한 것이다. BSON은 JSON과 비슷하지만, 몇 가지 중요한 차이점이 있다.

( 바이너리 형식은 컴퓨터가 데이터를 더 빠르고 효율적으로 처리할 수 있도록 설계된 형식이다.)

 

BSON의 특징

  1. 바이너리 형식: JSON은 텍스트 형식인 반면, BSON은 바이너리 형식입니다. 이는 데이터의 크기를 줄이고, 읽기 및 쓰기 속도를 향상시킨다.
  2. 다양한 데이터 타입: BSON은 JSON에서 지원하지 않는 추가 데이터 타입을 지원한다. 예를 들어, Date, ObjectId, Binary Data, Code 등.
  3. 크기 필드: BSON 문서는 각 요소의 길이를 포함한다. 이는 MongoDB가 데이터를 빠르게 탐색하고 조작하는 데 도움을 준다.
  4. 확장성: BSON은 쉽게 확장 가능하며, 새로운 데이터 타입을 추가할 수 있다.

MongoDB에서의 사용

  • 입력: MongoDB에 데이터를 입력할 때는 일반적으로 JSON 형식으로 데이터를 작성한다. 예를 들어, 클라이언트 애플리케이션에서 MongoDB로 데이터를 보낼 때 JSON 형식을 사용한다.
  • 저장: MongoDB는 이 JSON 데이터를 수신하여 내부적으로 BSON 형식으로 변환하여 저장한다. 
  • 전송 및 처리: MongoDB 클라이언트 라이브러리는 JSON 형식을 BSON으로 자동 변환하여 MongoDB 서버에 전송하고, 서버에서 BSON 형식을 받아 클라이언트에서 다시 JSON으로 변환하여 처리한다.

즉, 입 / 출력은 JSON으로 하되, mongoDB에서 저장만 BSON형식으로 한다는 뜻이다.

 

JSON

{
    "_id": "507f191e810c19729de860ea",
    "name": "John Doe",
    "age": 29,
    "isVerified": true,
}

 

BSON ( 바이너리로 인코딩된 예제는 사람이 읽기 어렵다.)

\x16\x00\x00\x00... (바이너리 데이터)

 

 

그럼 이제, BSON의 수 많은 데이터 타입이 있지만 주요 데이터 타입에 대해 알아보자. (node.js를 사용한다.)

 

1. String

  • 설명: 일반적인 텍스트 데이터이다.
  • 예: "Hello, World!"
{
    "string": "Hello World!"
}

2. Integer

  • 설명: 정수 데이터를 저장한다. 32비트와 64비트 정수를 지원한다.
  • 예: 42, NumberInt(42), NumberLong(42)
{
    "integer": 42
}

3. Double

  • 설명: 부동 소수점 숫자를 저장한다.
  • 예: 3.14159
{
    "double": 3.14159
}

4. Boolean

  • 설명: 참(true) 또는 거짓(false) 값을 저장한다.
  • 예: true, false
{
    "boolean": true
}

5. Array

  • 설명: 여러 값을 배열로 저장한다.
  • 예: [1, 2, 3, "four", true]
{
    "array": [1, 2, 3, "four", true]
}

6. Object

  • 설명: 중첩된 객체를 저장한다. JavaScript의 객체와 유사하다. object 안은 똑같이 필드와 밸류값으로 적을 수 있다.
  • 예: { "name": "Alice", "age": 30 }
{
    "object": {
        "name": "Alice",
        "age": 30
    }
}

7. Null

  • 설명: null 값을 저장한다.
  • 예: null
{
    "null": null
}

8. Undefined

  • 설명: undefined 값을 저장한다.
  • 예: undefined
{
    "undefined": undefined
}

9. Date

  • 설명: 날짜와 시간을 저장한다. ISODate 형식을 사용한다.
  • 예: new Date("2021-07-04T08:00:00Z")
{
    "date": ISODate("2021-07-04T08:00:00Z")
}

 

위 형식은 mongodb 내부에서 돌아가는 BSON 자료구조이고 지금 내가 사용하는 node.js 환경에서는 꼭 BSON 자료형으로 넘겨주지 않고 어떤 자료형은 아래와 같이 Node.js 내부 자료형으로 넘겨줘도 된다.

{
    "date": new Date("2021-07-04T08:00:00Z")
}

 

10. ObjectId

  • 설명: 각 도큐먼트를 유일하게 식별하는 ID를 저장한다. 12바이트로 구성되어 있다. 즉, MongoDB에서 각 Document의 Primary Key의 값으로 사용된다. 모두 16진수로 저장이 된다.
  • _id 필드 값을 따로 설정하지 않으면 ObjectId 객체가 저장되며, 따로 설정한 경우 해당 값으로 저장할 수 있다.
  • 예: ObjectId( "507f1f77 : 유닉스시간-저장된 시간 , bcf86c : 기기id , d799 : 프로세스id ,  439011 : 카운터 " )
  • 즉, 시간별로 다르고 기기별로 다르고 프로세스별로 다르다는 뜻 이 세 개가 모두 일치하다 해도, 카운터값은 매 번 올라가기 때문에 다르게 된다.
{
    "_id": ObjectId("507f191e810c19729de860ea")
}

 

따라서 주로 보게될 Document 들은 아래와 같은 형식으로 이루어져있다.

{
    "_id": "507f191e810c19729de860ea",
    "name": "Lsiron",
    "age": 28,
    "isVerified": true,
    "balance": 1234.56,
    "interests": ["reading", "travelling"],
    "address": {
        "street": "1 Main St",
        "city": "New York"
    }
}