상세 컨텐츠

본문 제목

MongoDb

인공지능/LLM 서비스 개발

by Ryuzy 2024. 11. 21. 17:24

본문

728x90
반응형

1. 데이터

데이터(data)는 정보나 사실들의 원시적이고 구조화되지 않은 형태입니다. 이것은 숫자, 문자, 이미지, 소리  다양한 형태로 나타날  있습니다. 예를 들면, 온도 측정 결과, 사진, , 음성 녹음 파일 등이 데이터에 해당합니다.

 

 

2. 데이터베이스

데이터베이스(database)는 관련된 데이터를 체계적으로 저장하고, 관리하고, 검색할 수 있도록 설계된 전자적 시스템입니다. 간단히 말하면, 데이터베이스는 "정보의 보관소" 같습니다. 데이터베이스를 사용하면 크거나 작은 양의 데이터를 안전하게 저장하고 필요할  쉽게 찾아낼  있습니다.

 

 

3. DBMS

DBMS 데이터베이스 관리 시스템(Database Management System) 약자입니다. DBMS 데이터베이스를 생성하고, 유지하고, 조작하기 위한 소프트웨어 도구의 집합입니다. 일반적으로 DBMS는 두 가지 유형으로 나뉩니다.

 

RDBMS (관계형 데이터베이스 관리 시스템)

데이터를 테이블 형태로 저장하며, 테이블 간의 관계를 정의할 수 있는 시스템입니다. 예로는 Oracle, MySQL, Microsoft SQL Server, PostgreSQL 등이 있습니다.

 

NoSQL DBMS

관계형 모델을 사용하지 않는 데이터베이스 시스템으로,  데이터 량이나 유동적인 데이터 구조를 지원하기 위해 설계되었습니다. 예로는 MongoDB, Cassandra, Redis 등이 있습니다.

 

 DB-ENGINES

데이터베이스 관리 시스템을 매월 검색엔진에서 노출 빈도 등 다양한 요소로 DB를 평가하여 순위를 지정해 주는 사이트

https://db-engines.com/en/ranking

 

DB-Engines Ranking

Popularity ranking of database management systems.

db-engines.com

 

 

4. MongoDB

MongoDB(몽고디비) NoSQL 데이터베이스 시스템  하나로, 문서 지향(document-oriented) 데이터베이스입니다. 이는 관계형 데이터베이스와는 다르게 데이터를 테이블이 아니라 JSON 스타일의 BSON(Binary JSON) 형식의 문서로 저장합니다. MongoDB 개발자가 유연하게 데이터를 저장하고 쿼리할  있도록 하는 목적으로 만들어진 것이며, 대규모의 분산 데이터베이스 환경에서도  동작합니다.

 

문서 지향 데이터베이스

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

 

스키마 없음 (Schema-less)

관계형 데이터베이스와 달리 MongoDB는 데이터베이스의 스키마를 명시적으로 정의하지 않습니다. 이는 동적인 스키마를 사용하여 데이터 모델을 유연하게 변경할 수 있도록 합니다.

 

유연한 데이터 모델

MongoDB는 다양한 데이터 형식을 지원하며, 중첩된 문서와 배열을 허용하여 복잡한 데이터 구조를 표현할 수 있습니다.

 

분산 데이터베이스

MongoDB는 여러 서버에 데이터를 분산하여 저장하고 처리할 수 있는 분산 데이터베이스 시스템을 지원합니다.

 

 

5. MongoDB Cloud

MongoDB Cloud는 MongoDB 데이터베이스를 클라우드 환경에서 제공하는 서비스입니다. MongoDB Cloud는 MongoDB, Inc.가 제공하는 공식 클라우드 서비스로서, MongoDB를 쉽게 관리하고 배포할 수 있도록 도와줍니다. 이 서비스는 데이터베이스 클러스터를 호스팅하고 관리하며, 사용자는 몽고DB 클라우드를 통해 데이터베이스를 쉽게 설정하고 확장할 수 있습니다.

 

클라우드 접속

https://www.mongodb.com/atlas/database

 

MongoDB Atlas Database | Multi-Cloud Database Service

The multi-cloud database service at the heart of our developer data platform that accelerates and simplifies how you build with data. Try MongoDB Atlas today!

www.mongodb.com

 

Studio3T 다운로드

Studio 3T는 MongoDB를 위한 강력한 GUI(그래픽 사용자 인터페이스) 도구로, 개발자와 데이터 분석가가 데이터베이스를 보다 쉽게 탐색하고 관리할 수 있도록 도와줍니다. SQL 스타일의 쿼리 변환 기능, 시각적인 집계 파이프라인 빌더, 데이터 임포트/익스포트, 스키마 뷰 및 IntelliShell 같은 기능을 제공하여 MongoDB의 복잡한 작업을 효율적으로 처리할 수 있게 해줍니다. 초보자부터 전문가까지 다양한 사용자가 GUI 기반으로 쿼리를 실행하고 데이터를 시각화하며, 테스트와 디버깅을 손쉽게 할 수 있도록 설계된 도구입니다.

 

https://studio3t.com/download/

 

Try MongoDB Tools - Download Free Here

Free download for MongoDB tools to do more with your database. MongoDB Shell, Compass, CLI for Cloud, BI Connector and other database tools available.

www.mongodb.com

 

 

6. MongoDB 문법

데이터베이스 확인

show databases

 

데이터베이스 생성 및 사용

use aiproject

 

컬렉션 생성

db.createCollection("user")

 

컬렉션 확인

show collections

 

문서 추가

db.user.insertOne({userid: "apple", name: "김사과", age: 20})
db.user.insertOne({name:"김사과", age:20, job:"프로그래머"})
db.user.insertOne({name:"배애리", age:29, gender:"여자"})
db.user.insertOne({name:"배애리", age:29, gender:"여자"})

 

데이터 조회

db.user.find()
db.user.find().pretty()

 

문서 여러 개 추가

db.user.insertMany([
{name:"반하나", age:25, job:"공무원"},
{name:"이메론", age:30, job:"의사"},
{name:"오렌지", age:33, job:"교직원"}
])

 

문서 수정

db.user.updateOne({name:'반하나'}, {$set:{age:22}})
db.user.updateMany({name:"배애리"}, {$set:{age:27}})

 

문서 삭제

db.user.deleteOne({name:'오렌지'})

 

컬렉션 삭제

db.user.drop()

 

데이터베이스 삭제

db.dropDatabase()

 

조건 검색

$eq 같다 (equal) { age: { $eq: 20 } }
$ne 같지 않다 (not equal) { age: { $ne: 20 } }
$gt 크다 (greater than) { age: { $gt: 20 } }
$gte 크거나 같다 { age: { $gte: 20 } }
$lt 작다 (less than) { age: { $lt: 20 } }
$lte 작거나 같다 { age: { $lte: 20 } }


// 여러문서 추가하기
db.students.insertMany([
{name:"김사과", age:20, major:"컴퓨터공학", grade:3.8},
{name:"반하나", age:23, major:"수학", grade:3.4},
{name:"오렌지", age:25, major:"물리", grade:3.6},
{name:"이메론", age:30, major:"수학", grade:3.9},
{name:"채애리", age:33, major:"컴퓨터공학", grade:3.2}
])

// 모든 문서 보기
db.students.find()

 

// 나이가 23살인 학생
db.students.find({age:23})
// 나이가 21살보다 많은 학생
db.students.find({age:{$gt:21}})
// 컴퓨터공학 전공이 아닌 학생
db.students.find({major:{$ne:"컴퓨터공학"}})

 

  • $and: 모든 조건을 만족해야 함
  • $or: 하나라도 만족하면 됨
  • $not: 조건 부정
  • $nor: 모든 조건을 불만족해야 함
// 나이가 21세 이상이면서 전공이 수학인 학생
db.students.find({
    $and: [
        {age:{$gte:21}},{major:"수학"}
    ]
})
// 나이가 20세이거나 전공이 물리인 학생
db.students.find({
    $or: [
        {age:20}, {major: "물리"}
    ]
})

 

  • $in: 여러 값 중 하나라도 포함되면 참
  • $nin: 여러 값 중 아무것도 포함되지 않으면 참
// 전공이 수학 또는 물리인 학생
db.students.find({
    major: { $in:["수학", "물리"]}
})

 

정렬(sort)

1 오름차순 (ASC)
-1 내림차순 (DESC)

 

// 나이로 내림차순 정렬
db.students.find().sort({ age:-1 })
// 성적으로 오름차순 정렬
db.students.find().sort({ grade: 1 })

 

limit(n)

  • 결과에서 앞에서부터 n개 문서만 가져옵니다.
  • 데이터가 너무 많을 때 일부만 보고 싶을 때 사용합니다.

skip(n)

  • 결과에서 앞에서부터 n개 문서를 건너뜁니다.
  • 페이지네이션에서 특정 페이지의 앞부분을 건너뛸 때 사용합니다.
// 상위 2명만 보기
db.students.find().limit(2)
// 2명을 건너뛰고 나머지 보기
db.students.find().skip(2)

// 전공이 수학 또는 물리인 학생 중 성적이 3.3 이상인 학생을 성적 높은 순으로 2명만 조회
db.students.find({
    $and: [
        {major: { $in: ["수학", "물리"] }},
        {grade: { $gte: 3.3 }}
    ]
}).sort({ grade: -1 }).limit(2)

 

ObjectId

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

db.students.find({ _id: ObjectId("681c0c1961515a3f4a441534")})
db.students.find()
db.students.updateOne({ _id: ObjectId("681c0c1961515a3f4a441536")},
    { $set: {name:"채리"}})
    
ObjectId("681c0c1961515a3f4a441536").getTimestamp()

 

Aggregation

여러 문서를 그룹화하거나, 통계/요약/변환된 결과를 만들어내는 복잡한 데이터 처리 도구입니다. SQL의 GROUP BY, SUM(), AVG(), JOIN 등과 비슷한 역할을 합니다. 여러 문서를 묶어서 계산하거나 새로운 형식으로 가공된 데이터를 만들고 통계, 분석, 리포트 등에 활용할 수 있는 기능입니다.

$match 조건으로 필터링 (find와 비슷)
$group 필드로 그룹화하고 통계 계산
$project 필드를 선택하거나 계산된 필드를 생성
$sort 정렬
$limit 개수 제한
$skip 건너뛰기
$lookup 다른 컬렉션과 조인
$unwind 배열을 펼치기
db.users.insertMany([
    {
        _id: 1,
        name: "김사과",
        age: 20,
        gender: "여",
        joinDate: ISODate("2023-01-10T00:00:00Z"),
        tags: ["몽고DB", "집계"],
        orders: [
            { orderId: 101, amount: 200000, orderDate: ISODate("2024-01-15T00:00:00Z") },
            { orderId: 102, amount: 450000, orderDate: ISODate("2024-03-22T00:00:00Z") }
        ],
        products: [
            { productId: "p1", category: "전자제품", price: 500000, rating: 4.8 },
            { productId: "p2", category: "의류", price: 50000, rating: 4.2 }
        ]
    },
    {
        _id: 2,
        name: "반하나",
        age: 25,
        gender: "여",
        joinDate: ISODate("2024-02-20T00:00:00Z"),
        tags: ["데이터베이스", "몽고DB"],
        orders: [
            { orderId: 103, amount: 300000, orderDate: ISODate("2024-02-18T00:00:00Z") }
        ],
        products: [
            { productId: "p3", category: "전자제품", price: 120000, rating: 4.6 }
        ]
    },
    {
        _id: 3,
        name: "오렌지",
        age: 30,
        gender: "남",
        joinDate: ISODate("2024-03-05T00:00:00Z"),
        tags: ["몽고DB", "집계", "데이터베이스"],
        orders: [],
        products: [
            { productId: "p4", category: "의류", price: 80000, rating: 4.1 }
        ]
    }
])

 

db.users.aggregate([{$match: {}}])
// 30세 이상인 사람만 선택
db.users.aggregate([{$match: {age: {$gte: 30}}}])

// 이름과 나이만 보여주기
db.users.aggregate([
    {$project: {name: 1, age: 1, _id: 0 }}
])

// 모든 사용자의 평균 나이 구하기
// _id: null 데이터를 한 덩어리로 묶음
db.users.aggregate([
    { $group: { _id: null, avgAge:{$avg: "$age"}}}
])

// 성별로 인원 수 세기
db.users.aggregate([
    { $group: { _id: "$gender", count: { $sum: 1 }}}
])

// 나이가 많은 순으로 상위 2명만 보기
db.users.aggregate([
    { $sort: { age: -1 }},
    { $limit: 2 }
])

// 연도별 가입자 수 구하기
db.users.aggregate([
    {
        $group: {
            _id: { $year: "$joinDate" },
            userCount: { $sum: 1 }            
        }
    },
    { $sort: { "_id": 1 }}
])

// 태그별로 몇 번 등장했는지 세기
db.users.aggregate([
    { $unwind: "$tags" },
    { $group: { _id: "$tags", count: { $sum: 1 }}},
    { $sort: { count: -1 }}
])

// 사용자별 총 구매 금액 구하기
db.users.aggregate([
    { $unwind: "$orders"},
    {
        $group: {
            _id: "$_id",
            total: { $sum: "$orders.amount" }
        }
    }
])

// 카테고리별 평균/최고 가격
// $avg, $max
db.users.aggregate([
    { $unwind: "$products" },
    {
        $group: {
            _id: "$products.category",
            avgPrice: { $avg: "$products.price" },
            maxPrice: { $max: "$products.price" }
        }
    }
])

// 평점 4.5 이상인 전자제품만 보기
db.users.aggregate([
    { $unwind: "$products" },
    { $match: { "products.category": "전자제품", "products.rating": { $gte: 4.5 } }},
    { $sort: { "products.rating": -1 }}
])

// 2024년 월별 매출 계산하기
db.users.aggregate([
    { $unwind: "$orders" },
    {
        $match: {
            "orders.orderDate": { $gte: ISODate("2024-01-01"), $lte: ISODate("2024-12-31")}
        }
    },
    {
        $group: {
            _id: { month: { $month: "$orders.orderDate"} },
            totalSales: { $sum: "$orders.amount" }
        }
    },
    { $sort: { "_id.month": 1 }}
])

 

728x90
반응형

'인공지능 > LLM 서비스 개발' 카테고리의 다른 글

프롬프트 엔지니어링  (1) 2024.11.28
파이썬과 몽고DB 연동  (0) 2024.11.22
크롤링  (3) 2024.11.20
인터넷과 웹서비스  (0) 2024.11.18
생성형 AI  (3) 2024.11.15

관련글 더보기