MongoDB | Today I Learned

hoya·2022년 4월 7일
0

Today I Learned

목록 보기
5/11
post-thumbnail
post-custom-banner

🧐 MongoDB 개요

MongoDB는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템으로, NoSQL 데이터베이스로 분류된다.
위키백과

🙄 NoSQL?

  • Not Only SQL, MySQL과 같은 관계형 데이터베이스를 사용하지 않음을 의미한다.

  • 장점

    • 많은 양의 데이터를 처리할 때 유리하며, 지연 시간이 낮다는 장점이 있다. (SNS 시스템에 유리)
    • Schema를 고정하지 않는 형태로, 데이터 구조를 미리 정의할 필요가 없다. (Schema-less)
    • 데이터 간 관계가 존재하지 않으므로 복잡한 join 문법을 사용할 일이 없다.
    • 서버 구조를 유연성 있게 제공하여 수평적 확장, 즉 데이터베이스의 분산이 가능하다.
  • 단점

    • 데이터 구조를 미리 정의할 필요가 없다는 뜻은, 데이터에 대한 일관성이 약하다는 것을 의미한다.
    • 중복 데이터가 있을 경우 수정, 삭제 과정이 원활하게 진행되지 않을 수 있다.
  • 정리

    • 정확한 데이터 구조를 알 수 없고 데이터가 수정될 일이 거의 없는 경우에 사용하는 것이 좋다.
    • 데이터의 일관성이 보장돼야 하거나 여러 join 문법이 필요할 경우엔 관계형 데이터베이스를 사용하는 것이 좋다.
    • 대용량 데이터를 처리할 때 NoSQL의 사용을 권장한다.

🙄 도큐먼트 지향 데이터베이스?

  • XML, JSON 유사 형식의 문서로 데이터 저장에 특화된 데이터베이스 구조를 의미한다.
  • 주어진 개체에 대한 모든 정보를 단일 인스턴스에 저장한다. (관계형 데이터베이스와 대조)
  • 데이터 구조는 Key - Value 의 형태로 저장된다.
    {
        "_id" : ObjectId("624c54982f2d9382bb11bb53"),
        "user_id" : "bcd001",
        "age" : 45.0,
        "status" : "B"
    }

🏗 간단한 구조 정리

  • RDBMS의 테이블 -> 컬렉션(Collection)
  • RDBMS의 레코드 -> 문서 객체(Document)
  • 데이터베이스는 컬렉션의 집합, 컬렉션은 문서의 집합이 된다.

😊 문법 실습

  • 정말 단순하게 실습한 내용을 개인적으로 정리해둔 것이므로, 어떤식으로 사용하는지 감만 잡아주시면 됩니다 :)
  • 기본 명령어 모음
    • show dbs : 현재 데이터베이스 목록 확인
    • use 데이터베이스명 : 사용 데이터베이스 선택
    • db.dropDatabase() : 데이터베이스 삭제
    • C(Create, Insert) : save(), insert(), insertOne(), insertMany()
    • R(Read, Select) : find()
    • U(Update) : updateOne(), updateMany()
    • D(Delete) : remove(), deleteOne(), deleteMany()
  • 기타 연산
    • $eq : 조건과 일치하는 값
    • $ne : 조건과 일치하지 않는 값
    • $gt : 조건보다 큰 값
    • $gte : 조건보다 같거나 큰 값 { age : { $gte : 20 }}
    • $lt : 조건보다 작은 값 {age : {$lt : 30}}
    • $lte : 조건보다 작거나 같은 값
    • $in : 조건으로 부여된 배열 안에 속하는 값 {age : { $in : [5, 15]}}
    • $nin : 조건으로 부여된 배열 안에 속하지 않는 값
    • $and : 부여된 모든 조건을 만족하는 경우 true 리턴
    • $or : 부여된 조건 중 하나라도 만족하면 true 리턴 { $or : [{age : 25}, {age : 50}] }
    • $not : 부여된 조건이 true 일 땐 false, false라면 true 리턴

기본 생성

// people 컬렉션이 없다면 데이터를 넣으며 생성
db.users.insert ([
    { name : "Abet", age : 19},
    { name : "Betty", age : 20},
    { name : "Charlie", age : 23, skills : ["mongodb", "nodejs"]},
    { name : "David", age : 23, score : 20}
]);

db.users.find(
    { age : { $gte : 20 }}, // 나이가 20이상인(Greater than Equal)
    { name : 1, _id : 0} // name 만 출력하겠다!
    // {name : 1, _id : 0, age : 1} -> 나이도 출력하겠다! 
).limit(5);
// 명시하여 컬렉션 생성
db.createCollection("users");

SQL과 비교하며 CRUD 실습


// CREATE, READ

db.people.insertMany(
    [
        {subject : "coffee", author : "xyz", views : 50},
        {subject : "Coffe Shopping", author : "efg", views : 10},
        {subject : "Baking a Coffe", author : "abc", views : 20}
    ]
)

// SELECT * FROM PEOPLE
db.people.find()

// SELECT * _id, user_id, status
db.people.find(
    {}, // 모든 필드임을 의미
    {_id : 1, user_id : 1, status : 1} // _id의 경우 0을 명시해주어야 안보임
)
// SELECT * FROM people WHERE status = "A"
db.people.find ({status : "A"})

// SELECT * FROM people WHERE status = "A" AND age = 50
db.people.find ({status : "A", age : 50})

// SELECT * FROM people WHERE status = "A" OR age = 50
db.people.find ({ $or:[{status : "A"}, {age : 50}]}) // 대괄호 필수

// SELECT * FROM people WHERE age > 25
db.people.find ({age : {$gt : 25}})

// SELECT * FROM people WHERE age < 25
db.people.find ({age : {$lt : 25}})

// SELECT * FROM people WHERE age > 25 AND age <= 50
db.people.find(
    {age : { $gt : 25 }, age : { $lte : 50 }}
)
db.people.find(
    {age : { $in : [25, 50]}} 
    // in : 들어간거 
    // nin : 안 들어간거
)

// SELECT * FROM people WHERE age = 5 OR age = 15
db.people.find(
    { $or : [{age : 5}, {age : 15}] }
)

// SELECT * FROM people WHERE user_id like "%bc%"
db.people.find( { user_id : /bc/ } );

// SELECT * FROM people WHERE user_id like "bc%"
db.people.find( { user_id : /^bc/ } ); // bc로 시작하는 것

// SELECT * FROM people WHERE status = "A" ORDER BY user_id ASC
db.people.find( { status : "A"}).sort({user_id : 1}) // 오름차순

// SELECT * FROM people WHERE status = "A" ORDER BY user_id DESC
db.people.find( { status : "A"}).sort({user_id : -1}) // 내림차순

// SELECT COUNT(*) FROM people
db.people.count()

// SELECT COUNT(user_id) FROM people
db.people.count( { user_id : { $exists : true }})

// SELECT DISTINCT(status) FROM people
db.people.distinct("status") // status 결과만 출력(중복 제거))

// Update, Delete

// UPDATE people SET status = "A" WHERE age > 22
db.people.updateMany(
    {age : {$gt : 22}}, 
    { $set : {status : "A"}}
)

// UPDATE people SET age = age + 3 WHERE status > "A"
db.people.updateMany(
    {status : "A"},
    { $inc : {age : 3}}
)

// DELETE FROM people WHERE status = "pending"
db.people.deleteMany( { status : "pending" })

// DELETE FROM people
db.people.deleteMany( {})

정리 실습

// 1. employees Collection 생성
db.createCollection("employees")
// 2. 다음 Document 데이터 넣기
db.employees.insert(
    [
        {user_id : "bcd001", age : 45, status : "A"},
        {user_id : "bcd002", age : 25, status : "B"},
        {user_id : "bcd003", age : 50, status : "A"},
        {user_id : "bcd004", age : 35, status : "A"},
        {user_id : "abc001", age : 28, status : "B"}
    ]
)
)

// 3. 다음 문법을 작성하시오.
// 3-1. user_id가 bcd002인 Document의 user_id, age, statuts, _id 출력
db.employees.find(
    {user_id : "bcd002"},
    {user_id : 1, age : 1, status : 1, _id : 1}
)
// 3-2. user_id가 bcd004 이거나, age가 28인 Document의 모든 필드 출력
db.employees.find(
    { $or : [ {user_id : "bcd004"}, {age : 28} ] }
)

// 3-4. age가 30보다 큰 Document의 user_id, age, _id 출력하기
db.employees.find(
    { age : {$gt : 30}}
)

// 3-5. age가 50이고 status가 A인 Document의 user_id만 출력하기
db.employees.find(
    { age : 50, status : "A" },
    { user_id : 1}
)

// 3-6. user_id 종류 출력하기
db.employees.distinct("user_id")

// 3-7. user_id가 bcd로 시작하는 전체 Document 출력하기
db.employees.find(
    { user_id : /^bcd/ }
)

// 3-8. user_id가 cd 문자를 포함하는 전체 Document 출력하기
db.employees.find(
    { user_id : /cd/ }
)

// 3-9. age가 40보다 큰 Document의 status를 B로 변환하기
db.employees.updateMany(
    { age : {$gt : 40}},
    { $set : {status : "B"}}
);

// 3-10. age가 30보다 작은 Document 삭제하기
db.employees.deleteMany(
    {age : {$lt : 30}}
)
profile
즐겁게 하자 🤭
post-custom-banner

0개의 댓글