MongoDB & Mongoose

365.48km·2023년 4월 12일
0

NoSQL

목록 보기
1/2

No SQL

  • NO SQL = Not Only SQl
    NO SQL 대표적인 유형으로는 Document,key-value,Graph가 있다. 그 중에서 MongoDB의 경우 Document에 속한다.

MongoDB

  • Data가 JSON-like-document로 저장이 된다.
  • 다시말해 보통의 DB인 SQL처럼 columnrow 기반이 아닌, JSON형태로 원하는 어떤 종류의 형태와 모양으로 데이터를 저장이 가능하다.
  • 즉, 모양과 형태의 제약이 없다는 보통의 SQL과는 큰 차별점이 있다.

Mongoose

  • Node.js와 MongoDB를 연결해주는 ODM(Object Document Mapping)중에서 가장 유명한 라이브러리이다.
  • 즉 Mongoose는 자바스크립트 환경에서도 MongoDB를 사용할 수 있도록 해주는 역할을 한다.
*ODM: Object와 Document를 1대1로 매칭하는 역할

  • DB연결, Schema정의, Schema에서 Model로 변환, Model을 이용한 Query 등

Mongoose 설치

npm install mongoose

MongoDB와 연결하기

  • Mongoose를 import
  • Mongoose의 connect 메소드를 사용한다.
    (기본적으로 localhost와 연결)
import mongoose from 'mongoose'

mongoose.connect(`localhsot:${port}/${db이름}`,{
  // 옵션 
  useNewUrlParser:true // mongoDB v5부터는 true로 추가해야한다.
  // url을 parsing할 떄, 새로운 parser를 사용하는 것
  })

const db = mongoose.connection
db.on("error", (error)=>console.log(error))
db.once("open", ()=>console.log("open"))
  • Mongoose.connection은 Mongoose로 연결한 첫 번째 연결
  • connection.on() / connection.once()는 Event Emitter 계열의 이벤트 Listen

Schema

  • MongoDB에는 Schema가 없지만, Mongoose에서 RDBMS처럼 Schema를 정의할 수 있다.
  • Document 내부의 각 field가 어떤 식으로 되어있는지를 정의
  • SQL의 table의 개념과 유사하다.

Schema 정의

  • mongooseimport한 뒤, new mongoose.Schema()를 통해 생성이 가능하다.
  • 각 field 별로 type, required, unique 등의 옵션 선택이 가능하다.,

const userSchema = new mongoose.Schema(
  {
    username: {
      type: String,
      required: true,
      unique: true,
    },
    displayName: {
      type: String,
      required: true,
    },
    password: {
      type: String,
      required: true,
      select: false,
    },
    // 암호화할 때 랜덤한 값을 생성하도록
    salt: {
      type: String,
      required: true,
      select: false,
    },
  },
);

const userModel = mongoose.model("User", userSchema);
  • Schema에서 Model로 변환한다.

Mongoose - populate

  • Mongoose.populate()는 다른 collections의 data를 참조핧 때 사용한다.
  • RDBMS에서는 JOIN을 하는 것과 유사한 것으로 MongoDB에서는 JOIN이 없기 때문에, 이러한 방식으로 참조를 한다.

사용법

  • 반드시, type을 mongoose.Schema.Types.ObjectId로 설정해야한다.
  • ObjectId : MongoDB에서 Collection에 data를 넣을 떄 자동으로 부여한다.
    - firebase에서 collection에 자동으로 id설정하는 것과 유사하다고 볼 수 있다.
  • RDBMS의 primary key처럼 사용이 가능하다.
  • ref : 해당 ObjectID로 어떤 model을 참조할 것인지 나타낸다.
export default mongoose.model(
  // Review 모델을 정의
  "Review",
  // Review 스키마 정의
  mongoose.Schema(
    {
      user: {
        type: Schema.Types.ObjectId,
        ref: "User", // User 모델 참조
        required: true,
      },
      content: {
        type: String,
        required: true,
      },
      mediaType: {
        type: String,
        enum: ["tv", "movie"],
        required: true,
      },
      mediaId: {
        type: String,
        required: true,
      },
      mediaTitle: {
        type: String,
        required: true,
      },
      mediaPoster: {
        type: String,
        required: true,
      },
    },
    modelOptions
  )
);

const reviews = media.reviews = await reviewModel.find({ mediaId }).populate("user").sort("-createdAt");

Mongoose - query(CREATE)

  • 데이터의 조회하는 방식을 의미한다.

  • 비동기 함수이므로, async, await, then(), callbcak등을 사용하여 코드 실행 순서를 반드시 보장해야한다.

  • Model.create({...})

  • save() : 객체를 새로 만들고 저장한다.

Mongoose - query(READ)

  • Model.find({...}) : 조건에 부합하는 documents를 **모두** 불러온다. - firebase의 getDocs`와 유사하다.
  • Model.findOne({...}) : 조건에 부합하는 documents 중 하나만 불러온다.
    - firebase의 getDoc과 유사하다.

Mongoose - query(UPDATE)

  • Model.findByIdAndUpdate({...}) : 해당 id의 documents를 불러와서 갱신하도록 한다.
cousrModel.findByIdAndUpdate(
  id, 
  {classTime:"Mon E, Web E"}
):
  • Model.updateOne({...}) : 조건에 부합하는 document를 불러와서 갱신한다.
coursModel.updateOne(
  {_id:id},
  { coursName : "Open Source"}
)

Mongoose - query(DELETE)

  • Model.findOneAndDelete({...}) : 조건에 부합하는 document중 하나만 삭제한다. 삭제할 데이터를 return
  • Model.deleteOne({...}) : 조건에 부합하는 document중 하나만 삭제한다. 삭제할 데이터를 return하지 않는다.
profile
이게 마즐까?

0개의 댓글