MongoDB 기본 유형 사용법

MongoDBBeginner
지금 연습하기

소개

이 랩에서는 MongoDB 의 다양한 기본 데이터 유형을 다루는 방법을 배우게 됩니다. 이 랩은 숫자, 문자열, 부울, 날짜 및 ObjectId 를 사용하여 데이터를 저장, 쿼리 및 조작하는 실용적인 예제를 다룹니다. 일반적인 데이터베이스 작업을 수행하고 각 데이터 유형의 적절한 사용 사례를 이해하는 실습 경험을 쌓게 됩니다. 이 랩이 끝나면 MongoDB 에서 데이터를 효과적으로 모델링할 수 있는 견고한 기반을 갖추게 될 것입니다.

숫자와 문자열 작업

이 첫 번째 단계에서는 가장 일반적인 데이터 유형인 숫자와 문자열을 사용하는 방법을 배우게 됩니다. MongoDB 셸을 시작하고, 데이터베이스와 컬렉션을 생성한 다음, 이러한 유형을 포함하는 문서를 삽입하고 쿼리합니다.

먼저 터미널을 열고 MongoDB 셸을 실행합니다. 이 대화형 환경을 통해 데이터베이스에 직접 명령을 실행할 수 있습니다.

mongosh

셸에 들어가면 > 프롬프트가 표시됩니다. inventory라는 새 데이터베이스를 생성하고 해당 데이터베이스로 전환해 보겠습니다. MongoDB 에서는 처음 데이터를 저장할 때 데이터베이스가 자동으로 생성됩니다.

use inventory

이제 products라는 컬렉션을 생성하고 문서를 삽입합니다. 이 문서에는 문자열 필드 (name) 와 두 개의 숫자 필드 (price, stock) 가 포함됩니다. MongoDB 는 BSON(Binary JSON) 유형을 사용하며, 숫자는 정수 또는 부동 소수점 숫자 (double) 가 될 수 있습니다.

db.products.insertOne({
    name: "Laptop",
    price: 1200.50,
    stock: 50
})

새로 삽입된 문서의 ObjectId와 함께 확인 메시지가 표시됩니다.

예시 출력:

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

문서가 삽입되었으므로 컬렉션을 쿼리해 보겠습니다. 먼저 $gt (greater than) 연산자를 사용하여 가격이 1000 보다 큰 제품을 찾습니다.

db.products.find({ price: { $gt: 1000 } })

예시 출력:

[
  {
    _id: ObjectId("..."),
    name: 'Laptop',
    price: 1200.5,
    stock: 50
  }
]

다음으로, 문자열 값인 제품의 정확한 이름으로 제품을 찾기 위한 쿼리를 수행합니다. 이는 특정 항목을 검색하는 일반적인 방법입니다.

db.products.find({ name: "Laptop" })

이 명령은 동일한 문서를 반환하며, 문자열 필드를 기반으로 쿼리하는 방법을 보여줍니다.

불리언 (Boolean) 및 Null 값 사용하기

이 단계에서는 불리언 (boolean) 및 Null 데이터 타입을 탐색합니다. 불리언은 플래그 (flag) 와 같이 참 (true) 또는 거짓 (false) 상태를 나타내는 필드에 이상적입니다. Null 타입은 값이 없는 필드를 나타내는 데 사용됩니다.

mongosh 셸에서 inventory 데이터베이스를 계속 사용해 보겠습니다. 불리언 필드 inStockonSalenull로 설정된 discontinuedDate 필드를 가진 새 제품을 삽입합니다.

db.products.insertOne({
    name: "Wireless Mouse",
    price: 25,
    inStock: true,
    onSale: false,
    discontinuedDate: null
})

예시 출력:

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

이제 불리언 및 Null 값을 가진 문서를 갖게 되었습니다. 다른 데이터 타입과 마찬가지로 이러한 값을 쿼리할 수 있습니다. 불리언 값 true를 쿼리하여 현재 재고가 있는 모든 제품을 찾아보겠습니다.

db.products.find({ inStock: true })

예시 출력:

[
  {
    _id: ObjectId("..."),
    name: 'Wireless Mouse',
    price: 25,
    inStock: true,
    onSale: false,
    discontinuedDate: null
  }
]

이 명령은 inStock 필드가 정확히 true인 문서를 검색합니다. 다음으로, discontinuedDate 필드에서 null 값을 찾아 단종되지 않은 제품을 찾아보겠습니다. MongoDB 에서는 null을 쿼리할 때 필드가 명시적으로 null로 설정된 문서와 필드가 전혀 존재하지 않는 문서 모두 일치한다는 점에 유의하십시오.

db.products.find({ discontinuedDate: null })

이 쿼리는 여러 문서를 반환합니다. "Wireless Mouse"(discontinuedDate: null 포함) 와 discontinuedDate 필드가 전혀 없는 다른 모든 제품 ("Laptop" 등) 입니다. 필드가 명시적으로 null로 설정된 문서만 찾으려면 다른 쿼리 패턴을 사용해야 합니다.

날짜 및 타임스탬프 저장

이 단계에서는 생성 날짜, 업데이트 또는 이벤트와 같은 시간 기반 정보를 저장하는 데 필수적인 Date 데이터 유형에 중점을 둡니다. MongoDB 는 날짜를 Unix epoch(1970 년 1 월 1 일 UTC) 이후 밀리초를 나타내는 64 비트 정수로 저장합니다.

날짜 필드가 있는 문서를 삽입해 보겠습니다. new Date()를 사용하여 현재 시간의 날짜 객체를 생성하거나 ISO-8601 날짜 문자열을 전달하여 특정 시간을 위한 날짜 객체를 생성할 수 있습니다.

db.products.insertOne({
    name: "Smartwatch",
    price: 250,
    purchaseDate: new Date("2023-10-26T10:00:00Z"),
    lastUpdated: new Date()
})

예시 출력:

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

이제 날짜 필드를 기반으로 제품을 쿼리해 보겠습니다. 예를 들어, 2023 년 초 이후에 구매한 모든 제품을 찾아보겠습니다. Date 객체와 함께 $gte (greater than or equal to) 연산자를 사용할 수 있습니다.

db.products.find({
    purchaseDate: { $gte: new Date("2023-01-01") }
})

예시 출력:

[
  {
    _id: ObjectId("..."),
    name: 'Smartwatch',
    price: 250,
    purchaseDate: ISODate('2023-10-26T10:00:00.000Z'),
    lastUpdated: ISODate('...')
  }
]

MongoDB 는 날짜에 대한 업데이트 연산자도 제공합니다. $currentDate 연산자는 필드를 현재 서버 날짜로 설정하는 데 유용합니다. 이전에 생성한 "Laptop" 문서의 lastUpdated 필드를 업데이트하여 마지막으로 수정된 시간을 추적해 보겠습니다.

db.products.updateOne(
    { name: "Laptop" },
    { $currentDate: { lastUpdated: true } }
)

예시 출력:

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

이 작업은 "Laptop"이라는 이름의 문서를 찾아 lastUpdated 필드를 현재 타임스탬프로 업데이트합니다.

ObjectId 및 배열 이해

이 마지막 단계에서는 ObjectIdArray라는 두 가지 중요한 구조적 유형에 대해 배웁니다. MongoDB 의 모든 문서는 고유한 _id 필드를 가지며, 제공되지 않으면 기본적으로 ObjectId가 됩니다. 배열을 사용하면 단일 필드 내에 값 목록을 저장할 수 있습니다.

먼저 tags라는 배열 필드가 있는 문서를 삽입해 보겠습니다. 이는 여러 범주 또는 속성을 저장하는 데 유용합니다.

db.products.insertOne({
    name: "Mechanical Keyboard",
    price: 75,
    tags: ["gaming", "mechanical", "RGB"]
})

예시 출력:

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

insertedId는 이 새 문서의 ObjectId입니다. 이는 고유성을 보장하는 12 바이트 값입니다. _id로 문서를 쿼리할 수 있습니다. 먼저 문서를 찾고 해당 _id를 변수에 저장합니다.

const keyboard = db.products.findOne({ name: "Mechanical Keyboard" })
const keyboardId = keyboard._id

이제 이 keyboardId 변수를 사용하여 문서를 다시 가져옵니다. 이것이 단일 특정 문서를 검색하는 가장 효율적인 방법입니다.

db.products.findOne({ _id: keyboardId })

다음으로 tags 배열을 사용해 보겠습니다. 배열에 특정 요소가 포함된 문서를 쿼리할 수 있습니다. 예를 들어 "gaming" 태그가 지정된 모든 제품을 찾으려면 다음과 같이 합니다.

db.products.find({ tags: "gaming" })

예시 출력:

[
  {
    _id: ObjectId("..."),
    name: 'Mechanical Keyboard',
    price: 75,
    tags: [ 'gaming', 'mechanical', 'RGB' ]
  }
]

이 명령은 tags 배열에 "gaming" 문자열이 포함된 모든 문서를 효율적으로 찾습니다. 배열은 단일 문서 내에서 관계를 모델링하는 강력한 기능입니다. MongoDB 셸을 종료하려면 exit를 입력하거나 Ctrl+D를 누릅니다.

exit

요약

이 실습에서는 MongoDB 의 가장 필수적인 데이터 유형을 다루는 방법을 배웠습니다. 숫자와 문자열을 사용하여 제품 정보를 저장하고 쿼리하는 것부터 시작했습니다. 그런 다음 상태 플래그와 누락된 데이터를 나타내기 위해 부울 값과 null 값을 탐색했습니다. 또한 Date 유형과 관련 연산자를 사용하여 시간 데이터를 처리하는 방법을 배웠습니다. 마지막으로 고유 식별자로서의 ObjectId와 값 목록을 저장하기 위한 Array 유형에 대한 이해를 얻었습니다. 이 지식은 광범위한 애플리케이션을 위한 MongoDB 데이터베이스를 설계하고 상호 작용하는 데 강력한 기반을 제공합니다.