[DB] mongoDB

장동균·2023년 9월 27일

https://www.youtube.com/watch?v=c2M-rlkkT5o&t=836s
유튜브 강의를 간단히 요약하는 글이다.


mongoDB 구성요소

mongoDB는 field, document, collection, database로 구성된다.

field는 한 개의 key-value 쌍이다.

document는 1개 이상의 field가 모인 JSON 형태의 객체이다.

collection은 1개 이상의 document가 모인 집합이다.

database는 1개 이상의 collection이 모인 집합이다.


mongoDB 설치

https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x
공식 문서 참고

$ brew tap mongodb/brew

$ brew update

$ brew install mongodb-community@7.0 (사실 요거만해도 될듯?)

<시작>

$ brew services start mongodb-community@7.0

<종료>

$ brew services stop mongodb-community@7.0

<실행>

mongosh

vscode에서는 mongoDB에 대한 extension을 지원해주기 때문에 이를 활용해서 실행시키는 방법을 추천한다.


Database

show dbs

전체 데이터베이스 확인 (비어있는 데이터베이스는 노출되지 않음)

use ${database}

특정 데이터베이스로 이동 (존재하지 않는 경우, 데이터베이스 생성 후 이동)

db.dropDatabase()

현재 데이터베이스 제거


Collection

show collections

전체 collection 확인

db.createCollection({collection name})

ex) db.createCollection("students") => students라는 collection 생성

db.${collection}.drop()

collection 삭제


Find

db.${collection}.find()

컬렉션의 모든 documents 노출

메서드는 체이닝이 가능하다. (type, chaining 등을 볼 때 자바스크립트의 문법과 매우 유사함)

db.${collection}.find().sort(${sort option})

ex) db.students.find().sort({ name: 1 }) => name field를 기준으로 오름차순 정렬

ex) db.students.find().sort({ name: -1 }) => name field를 기준으로 내림차순 정렬

db.${collection}.find().limit(${number})

ex) db.students.find().limit(3) => 상단 3개의 documents 노출

db.${collection}.find(query, projection)

db.students.find({ name: "Spongebob" }) => name이 Spongebob인 documents 노출

db.students.find({ name: "Spongebob", gpa: 4.0 })

컴마로 구분한 여러 개의 쿼리를 사용할 수 있다

_id field는 default가 true. 이외의 모든 field의 default는 false

db.students.find({}, { name: true })

전체 documents의 name field를 노출

_id 값은 default가 true이기 때문에 함께 노출된다. name field만을 확인하고 싶다면 다음과 같은 구문을 작성해볼 수 있다.

db.students.find({}, { _id: false, name: true })


Insert

db.${collection}.insertOne(${document})

collection에 하나의 document 추가

ex) db.students.insertOne({ name: "Spongebob", age: 30 })

db.${collection}.insertMany(${documents})

collection에 여러개의 documents 추가 (배열)

ex) db.students.insertMany([{ name: "Patrick", age: 38 }, { name: "Sandy", age: 28 }])


Update

db.${collection}.updateOne(updateMany)(filter, update)

updateOne 메서드의 filter는 보통 _id 값을 사용한다.

ex) db.students.updateOne({ _id: ObjectId("642") }, { $set: { fullTime: false } } )

ObjectId("642")를 _id로 가지는 document의 fullTime field를 false로 설정한다

ex) db.students.updateOne({ _id: ObjectId("642") }, { $unset: { fullTime: "" } } )

ObjectId("642")를 _id로 가지는 document의 fullTime field를 제거한다

ex) db.students.updateMany({}, { $set: {fullTime: false } })

모든 documents의 fullTime field를 false로 설정한다

ex) db.students.updateMany({ fullTime: { $exists: false } }, { $set: { fullTime: true } })

fullTime field가 없는 documents에 대해 fullTime field를 true로 설정한다


Delete

db.${collection}.deleteOne(deleteMany)(filter)


ex) db.students.deleteOne({ name: "Larry" })

ex) db.students.deleteMany({ fullTime: false })

ex) db.students.deleteMany({ registerDate: { $exists: false } })

registerDate field가 존재하지 않는 documents를 제거


Comparison operator

$ne (not equal)

ex) db.students.find({ name: { $ne: "Spongebob" } })

name field가 Spongebob이 아닌 documents 노출

$lt (less than, 미만)

ex) db.students.find({ age: { $lt: 20 } })

age field가 20 미만인 documents 노출

$lte (less than equal, 이하)

$gt (greater than, 초과)

$gte (greater than equal, 이상)

ex) db.students.find({ gpa: {$gte: 3, $lte: 4 } })

gpa field가 3이상 4이하인 documents 노출

$in

ex) db.students.find({ name: { $in: ["Spongebob", "Kenny"] } })

name field가 Spongebob 혹은 Kenny인 documents 노출

$nin (not in)


Logical operator

$and

ex) db.students.find({ $and: [{ fullTime: true }, { age: { $lte: 22 } } ] })

fullTime field가 true이면서, age field가 22이하인 documents 노출

$or

ex) db.students.find({ $or: [{ fullTime: true }, { age: { $lte: 22 } } ] })

조건들 중 한개라도 true라면 노출

$nor

모든 조건이 false라면 노출

$not

ex) db.students.find({ age: { $lt: 30 } })

age field가 30 미만인 documents 노출 (age가 존재하지 않는 경우는 노출하지 않음)

ex) db.students.find({ age: { $not: { $gte: 30 } } })

age field가 30미만인 documents 노출 (age가 존재하지 않는 경우도 노출)

not 연산자가 다른 연산자와 다른 점은 null인 field도 보여준다는 점!


Index

기존에 데이터 조회는 O(n)의 시간복잡도. 데이터가 많아지면 조회하는데 시간이 많이 필요

https://ryu-e.tistory.com/1 (설명과 사용방식이 해당 블로그에 굉장히 자세히 설명되어있음)


db.${collection}.createIndex(filter)

인덱스 생성

db.${collection}.getIndexes()

전체 인덱스 조회

db.${collection}.dropIndex(${index name})


Tip) .explain("executionStats")를 통해 실행에 대한 정보를 얻을 수 있다

profile
프론트 개발자가 되고 싶어요

1개의 댓글

comment-user-thumbnail
2023년 10월 10일

mongo반점

답글 달기