MongoDB

2024년 11월 18일
12

MongoDB

MongoDB는 관계형 데이터베이스가 아닌 필드와 값 쌍으로 구성된 데이터 구조인 문서입니다.

문서의 구조는 JSON과 유사하며, 필드 값에는 다른 문서, 배열 및 문서 배열이 포함될 수 있습니다.

데이터베이스

MongoDB에서 데이터베이스는 하나 이상의 문서 컬렉션을 보유합니다.

데이터베이스 사용

use myDB

데이터베이스 생성

MongoDB에서는 데이터를 처음 저장할 때 데이터베이스가 생성됩니다.

따라서 아래와 같이 데이터베이스를 생성할 수 있습니다.

use myNewDB
 
db.myNewCollection1.insertOne( { x: 1 } )

컬렉션

컬렉션은 관계형 데이터베이스의 테이블과 유사합니다.

컬렉션 생성

컬렉션도 데이터베이스와 마찬가지로 데이터를 처음 저장할 때 생성됩니다.

db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )

문서

MongoDB는 데이터를 BSON 문서로 저장합니다. JSON의 바이너리 표현이지만 JSON보다 더 많은 데이터 유형을 포함합니다.

문서 구조

문서는 필드-값으로 구성되며 아래와 같은 구조를 갖습니다.

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}

필드의 값은 배열, 문서 배열 또는 문자열을 포함하여 모드 BSON의 데이터 유형이 될 수 있습니다.

var mydoc = {
               _id: ObjectId("5099803df3f4948bd2f98391"),
               name: { first: "Alan", last: "Turing" },
               birth: new Date('Jun 23, 1912'),
               death: new Date('Jun 07, 1954'),
               contribs: [ "Turing machine", "Turing test", "Turingery" ],
               views : NumberLong(1250000)
            }
  • _id : ObjectId
  • name : first, last 필드가 포함된 문서
  • birth, death : Date형식
  • contribs : 문자열 배열
  • views : NumberLong형식의 값

필드 이름

필드의 이름은 문자열로 구성되어있습니다.

필드 이름은 제한이 존재합니다.

  • _id는 프라이머리 키로 사용되기 때문에 컬렌션에 고유적으로 존재하며, 수정이 불가능합니다.
  • null 문자를 포함할 수 없습니다.
  • .,$ 의 사용이 가능합니다.

점 표기법

MongoDB는 . 을 사용하여 배열의 값을 가져올 수 있습니다.

배열

값.인덱스 방식으로 배열의 요소에 접근할 수 있습니다.

"<array>.<index>"

다음과 같은 필드가 존재한다고 가정하겠습니다.

{
   ...
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   ...
}

아래 코드는 점 표기법을 통해서 데이터를 조회하는 코드입니다.

db.collection.find({"contribs.0":"Turing machine"})

만일 필드 안에 문서가 지정되어있을 땐 다음과 같이 사용할 수 있습니다.

"<embedded document>.<field>"

다음과 같은 필드가 존재한다고 가정하겠습니다.

{
   ...
   name: { first: "Alan", last: "Turing" },
   contact: { phone: { type: "cell", number: "111-222-3333" } },
   ...
}

아래 코드는 점 표기법을 통해서 데이터를 조회하는 코드입니다.

db.collection.find({"contact.phone.number":"111-222-3333"})

문서 삽입

단일 문서 삽입

db.inventory.insertOne(
   { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)

여러 문서 삽입

db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
   { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
   { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])

문서 조회

모든 문서 조회

inventory 컬렉션의 모든 문서를 조회합니다.

db.inventory.find( {} )

문서 조건 조회

inventory 컬렌션의 status 필드 값이 “D” 인 모든 문서를 조회합니다.

db.inventory.find( { status: "D" } )

쿼리 연산자를 사용하여 조회

inventory 컬렌션의 status 필드의 값에 “A” 또는 “D” 인 모든 문서를 조회합니다.

db.inventory.find( { status: { $in: [ "A", "D" ] } } )

💡 $or 연산자를 사용할 수 있지만 동일한 필드에서 동등성 검사를 수행할 때에는 $in 연산자를 사용합니다.

AND 조건 지정 조회

inventory 컬렉션의 status 필드의 값이 “A”이고, qty 필드의 값이 30보다 작은 모든 문서를 조회합니다.

db.inventory.find( { status: "A", qty: { $lt: 30 } } )

OR 조건 지정 조회

inventory 컬렉션의 status 필드의 값이 “A” 이거나, qty 필드의 값이 30보다 작은 모든 문서를 조회합니다.

db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

AND, OR 조건 지정 조회

inventory 컬렉션의 status 필드의 값이 “A”이면서, qty 필드 값이 30보다 적거나, item 필드 값의 이름이 p로 시작하는 모든 문서를 조회합니다.

db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )

배열 조회

inventory 컬렉션의 tags 필드 배열 값이 “red”, “blank” 순서로 되어 있는 모든 문서를 조회합니다.

db.inventory.find( { tags: ["red", "blank"] } )

순서에 상관없이 조회 시 $all 를 사용할 수 있습니다.

db.inventory.find( { tags: { $all: ["red", "blank"] } } )

여러 기준을 충족하는 배열 요소 조회하기

$elemMatch 연산자를 사용하면 배열 요소에 여러 기준을 지정합니다.

inventory 컬렉션의 dim_cm 필드의 배열 값이 22 보다 크고 33보다 작은 값이 하나 이상 포함되어 있는 문서를 조회합니다.

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )

지정된 필드만 반환

inventory 컬렉션의 status 필드의 값이 “A”인 문서들의 item, ststus 요소만 반환합니다.

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

지정된 필드를 제외하고 반환

inventory 컬렉션의 status 필드의 값이 “A”인 문서들의 item, ststus 요소를 제외한 모든 필드 반환합니다.

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )

문서 수정

단일 문서 수정

item 필드의 값이 “paper”인 하나의 문서를 $set 연산자를 이용하여 size필드의 uom필드의 값을 “cm”으로 변경하고, status 필드값을 “P”로 변경합니다. $currentDate 연산자를 이용하여 lastModified 필드의 값을 현재 날짜로 변경합니다.

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

여러 문서 수정

qty 필드의 값이 50보다 작은 모든 문서를 $set 연산자를 이용하여 size필드의 uom필드의 값을 “in”으로 변경하고, status 필드값을 “P”로 변경합니다. $currentDate 연산자를 이용하여 lastModified 필드의 값을 현재 날짜로 변경합니다.

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

문서 교체

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

문서 삭제

모든 문서 삭제

db.inventory.deleteMany({})

조건과 일치하는 모든 문서 삭제

inventory 컬렉션의 status 필드의 값이 “A”인 모든 문서를 삭제합니다.

db.inventory.deleteMany({ status : "A" })

조건과 일치하는 단일 문서 삭제

inventory 컬렉션의 status 필드의 값이 “D”인 하나의 문서를 삭제합니다.

db.inventory.deleteOne( { status: "D" } )

연산자

비교 연산자

  • $eq: 지정된 값과 같은 값을 일치시킵니다.
  • $gt: 지정된 값보다 큰 값을 일치시킵니다.
  • $gte: 지정된 값보다 크거나 같은 값을 찾습니다.
  • $in: 배열에 지정된 값과 일치시킵니다.
  • $lt: 지정된 값보다 작은 값을 일치시킵니다.
  • $lte: 지정된 값보다 작거나 같은 값을 찾습니다.
  • $ne: 지정된 값과 같지 않은 모든 값을 찾습니다.
  • $nin: 배열에 지정된 값 중 어느 것과도 일치하지 않습니다.

논리 연산자

  • $and: 논리적 AND 사용하여 쿼리 절을 조인하면 두 절의 조건과 일치하는 모든 문서를 반환합니다.
  • $not: 쿼리 표현식의 효과를 반전시키고 쿼리 표현식과 일치하지 않는 문서를 반환합니다.
  • $nor: 논리적 NOR 사용하여 쿼리 절을 조인하면 두 절과 일치하지 않는 모든 문서를 반환합니다.
  • $or: 논리적 OR 사용하여 쿼리 절을 조인하면 두 절의 조건과 일치하는 모든 문서를 반환합니다.

요소 연산자

  • $exists: 지정된 필드가 있는 문서와 일치시킵니다.
  • $type: 필드가 지정된 유형인 경우 문서를 선택합니다.

평가 연산자

  • $expr: 쿼리 언어 내에서 집계 표현식을 사용할 수 있습니다.
  • $jsonSchema: 주어진 JSON Schema에 대해 문서의 유효성을 검사합니다.
  • $mod: 필드 값에 대해 모듈로 연산을 수행하고 지정된 결과가 있는 문서를 선택합니다.
  • $regex: 지정된 표현식과 일치하는 값이 있는 문서를 선택합니다.
  • $text: 텍스트 검색을 수행합니다.
  • $where: JavaScript 표현식을 만족하는 문서와 일치시킵니다.