BACK-END

[MongoDB] MongoDB

gudwns5533 2026. 7. 17. 16:15

1. MongoDB란

  • NoSQL 데이터베이스 시스템 중 하나로, 문서 지향 데이터베이스
  • 관계형 데이터베이스와는 다르게 데이터를 테이블이 아니라 JSON 스타일의 BSON(Binary JSON)형식의 문서로 저장
  • 개발자가 유연하게 데이터를 저장하고 쿼리할 수 있도록 목적으로 만들어짐.

1-1. 문서 지향 데이터베이스

데이터를 BSON형식의 문서로 저장. 이 문서는 키-값 쌍으로 이루어져 있으며, 여러 종류의 데이터 유형을 포함할 수 있다.

1-2. 스키마가 없다.

관계형 데이터베이스와 달리 MongoDB는 데이터베이스의 스키마를 명시적으로 정의하지 않는다.

동적인 스키마를 사용하여 데이터 모델을 유연하게 변경할 수 있도록 했다.

{"no":1, "userid":"apple", "userpw":"1111"}
{"no":2, "userid":"banana", "userpw":"2222", email."banana@banana.com}
{"name":오렌지, "hp":"010-1111-1111"}

2. 요청 본문(Body)

클라이언트가 서버에 데이터를 보낼 때, 그 데이터는 body에 담겨온다.

2-1. 요청 JSON

{
    "text": "점심 메뉴 정해줘"
}

2-2. 서버에서는 req.body로 읽음

Express에서 JSON body를 읽으려면 app.use(express.json()) 미들웨어를 등록해야한다.

2-3. MongoDB를 불러옴

npm i mongodb 설치

const { MongoClient } = require("mongodb")

2-4. MongoDB 연결 준비

url = "mongodb://127.0.0.1:27017..."

const client = new MongoClient(url)

3. 데이터 조회 및 수정

3-1. GET으로 데이터 조회

http://127.0.0.1:3000/memos
- postman 없어도 브라우저를 통해 확인 가능

http://127.0.0.1:3000/memos?keyword=공부
- req.query.keyword로 읽을 수 있음

http://127.0.0.1:3000/memos/:id
- 서버에서는 URL 파라미터를 req.params.id로 읽음

3-2. PUT/ PATCH로 데이터 수정

PUT

  • 서버에 이미 존재하는 자원을 전체적으로 수정하거나 특정 자원을 새로 생성할 때 사용하는 방식
  • 클라이언트는 수정할 데이터 전체를 요청 본문에 담아 서버로 전달하며, 서버는 해당 자원을 전달받은 데이터로 완전히 교체하는 방식으로 업데이트를 한다.

PATCH

  • 서버에 존재하는 자원의 일부 데이터만 부분적으로 수정할 때 사용하는 방식
  • 클라이언트는 수정이 필요한 필드만 요청 본문에 담아 서버로 전달하며, 서버는 해당 자원의 특정 부분만 업데이트

4. MongoDB playground

// 데이터베이스 선택 및 생성
use("AIdb")

// db: AIdb
// students: 컬렉션 (컬렉션이 없다면 생성하면서 삽입)
// insertOne: 문서를 1개 넣는 메서드
db.students.insertOne({
    userid: "apple",
    name: "김사과",
    age: 20,
    major: "AI",
    score: 88
})

// insertMany(): 여러 문서를 한 번에 넣음
use("AIdb")
db.students.insertMany([
    { name: "김사과", age: 20, major: "AI", score: 88 },
    { name: "반하나", age: 25, major: "Backend", score: 91 },
    { name: "오렌지", age: 30, major: "Frontend", score: 77 }
])


// 전체 조회
// find(): 문서를 조회하는 기본 메서드
// {}: 조건이 없다는 뜻
use("AIdb")
db.students.find({})

/*
    ObjectId
    - 각 문서의 12바이트(24자리 16진수) 고유한 ID로 사용되는 데이터 타입
    - SQL의 기본키와 비슷한 역할을 함
    - 각 문서에 _id 필드를 기본적으로 생성하며, 특별히 지정하지 않으면 자동으로 ObjectId 형태로 생성
*/



/*
    $eq 같다
    $ne 같지 않다
    $gt 크다
    $gte 크거나 같다
    $lt 작다
    $lte 작거나 같다
*/

// 이름이 김사과인 조회 조회
use("AIdb")
db.students.find({ name: "김사과" })

// 점수가 80점 이상인 학생 조회
use("AIdb")
db.students.find({ score: { $gte: 80 } })

// 나이가 23 초과인 학생 조회
use("AIdb")
db.students.find({ age: { $gt: 23 } })

// 원하는 필드만 조회
use("AIdb")
db.students.find({}, { name: 1, score: 1, _id: 0 })

// 1개만 조회
use("AIdb")
db.students.find({})
use("AIdb")
db.students.findOne({ name: "김사과" })

// 점수 정렬
use("AIdb")
db.students.find({}).sort({ score: 1 }) // 1: 오름차순
use("AIdb")
db.students.find({}).sort({ score: -1 }) // -1: 내림차순

// 개수 세기
use("AIdb")
db.students.countDocuments({})

//특정 조건을 만족하는 학생 수
use("AIdb")
db.students.countDocuments({ score: { $gte: 80 } })

// 1개 수정
// 첫 번째 객체: 누구를 수정할지 조건
// 두 번째 객체: 무엇을 어떻게 바꿀지 조건
use("AIdb")
db.students.updateOne(
    { name: "김사과" },
    { $set: { score: 95 } }
)

// 여러 데이터 수정
use("AIdb")
db.students.updateMany(
    { major: "AI" },
    { $set: { major: "Artificial Intelligence" } }
)

// 숫자 증가시키기
use("AIdb")
db.students.updateMany(
    {}, { $inc: { score: 3 } }
)

// 문서 삭제 (한개)
use("AIdb")
db.students.deleteOne({ name: "오렌지" })

// 여러 문서 삭제
use("AIdb")
db.students.deleteMany({ score: { $lt: 100 } })

'BACK-END' 카테고리의 다른 글

[Node.js] Node.js 기초 2  (0) 2026.07.17
[Node.js] Node.js 기초 1  (0) 2026.06.28
[MySQL] MySQL 연동  (0) 2026.06.09
[MySQL] 뷰 (view)  (0) 2026.06.09
[MySQL] MySQL 함수  (0) 2026.06.09