[MongoDB] Mongoose???

유동균·2023년 1월 29일
0

MongoDB

목록 보기
5/12
post-thumbnail

https://mongoosejs.com/docs/schematypes.html

1. Mongoose???

  • Node.js와 MongoDB를 위한 ODM(Object Data Mapping) 라이브러리

  • ODM을 활용하면 프로그래밍 언어 Object와 MongoDB의 데이터를 Mapping하여 호환성을 만들어내고, 간편한 CRUD 가능

ODM

  • ODM(Object Data Mapping)은 객체와 문서의 1대1 매칭
    Object는 자바스크립트의 객체, Document는 MongoDB의 문서
  • 즉, 문서를 DB에서 조회할 때 자바스크립트 객체로 바꿔주는 역할
  • 장점

    • 스키마와 모델을 만드는 것을 통하여 data를 불러온 후에 그 데이터를 객체화시키는 것이 빠름

    • 그 객체를 수정함으로써 데이터에 수정할 수 있음.

    • 또한 분명하게 모델링된 문서(Document)들이 모여있는 Collection을 관리하는 것도 수월.

2. Install

$ npm i mongoose

3. Run

// mongoDB를 node.js에서 사용할 수 있도록 만든 것이 mongoose 모듈
const mongoose = require("mongoose");
// strictQuery Error 해결
mongoose.set("strictQuery", true);

mongoose
  .connect("mongodb://localhost:27017/movieApp")
  .then(() => {
    console.log("Connection Open");
  })
  .catch((e) => {
    console.log("ERROR");
    console.log(e);
  });
});

Mongoose 버전이 6.0 이상이면 useNewUrlParser, useUnifiedTopology, useFindAndModify 및 useCreateIndex는 더 이상 지원되지 않는 옵션

Mongoose 버전 6.0 이상부터는 기본적으로 useNewUrlParser, useUnifiedTopology, useFindAndModify가 true, useCreateIndex가 false로 동작

mongoose.connect() 기본 포트 (27017)에서 로컬로 실행 되는 myapp 데이터베이스 를 연결하는 데 필요한 최소값 입니다. 컴퓨터에서 연결에 실패하면 localhost 대신 127.0.0.1 을 사용

strictQuery Error : Automattic

4. Schema

  • mongoDB에는 스키마가 없기 때문에 몽구스를 사용해서 스키마를 생성
  • 스키마는 데이터베이스의 테이블, 컬렉션의 타입과 속성을 정의해 각각의 필드에 저장하는 값에 의존성을 부여
  • 스키마는 컬렉션에 들어가는 문서 내부의 각 필드가 어떤 형식으로 되어 있는지 정의하는 객체
  • 스키마를 정의할 때는 mongoose.Schema 객체를 인스턴스화하여 스키마 값을 객체 형식으로 필드의 이름과 타입을 순서로 스키마를 정의
  • 각 필드 이름과 필드의 데이터 타입 정보가 들어 있는 객체를 작성한다.
  • 필드의 기본값으로는 default 값을 설정하면 된다.
  • 스키마 내부에 다른 스키마를 내장 시킬 수도 있다.
const { Schema } = mongoose;

const PostSchema = new Schema({
  title: String,
  body: String,
  tags: [String], // 문자열 배열
  publishedDate: {
    type: Date,
    default: Date.now // 현재 날짜를 기본값으로 지정
})

4.1. 타입

  • String : 문자열
  • Number : 숫자
  • Date : 날짜
  • Buffer : 파일을 담을 수 있는 버퍼
  • Boolean : treu or false
  • Mixed(Schema.Types.Mixed) : 어떤 데이터도 넣을 수 있는 형식
  • ObjectId(Schema.Types.ObjectId) : 객체 아이디, 주로 다른 객체를 참조할 때 넣음
  • Array : 배열 형태의 값, []로 감싸서 사용

4.1.1. 타입별 옵션

  • String
    • lowercase : boolean, whether to always call .toLowerCase() on the value
    • uppercase : boolean, whether to always call .toUpperCase() on the value
    • trim : boolean, whether to always call .trim() on the value
    • match : RegExp, creates a validator that checks if the value matches the given regular expression
    • enum : Array, creates a validator that checks if the value is in the given array.
    • minLength : Number, creates a validator that checks if the value length is not less than the given number
    • maxLength : Number, creates a validator that checks if the value length is not greater than the given number
    • populate : Object, sets default populate options
  • Number
    • min : Number, creates a validator that checks if the value is greater than or equal to the given minimum.
    • max : Number, creates a validator that checks if the value is less than or equal to the given maximum.
    • enum : Array, creates a validator that checks if the value is strictly equal to one of the values in the given array.
    • populate : Object, sets default populate options
  • Date
    • min : Date, creates a validator that checks if the value is greater than or equal to the given minimum.
    • max : Date, creates a validator that checks if the value is less than or equal to the given maximum.
    • expires : Number or String, creates a TTL index with the value expressed in seconds.
  • ObjectId
    • populate : Object, sets default populate options

4.2. 속성

  • required : (boolean or function) 값이 true이면 꼭 입력해야 한다.
  • default : (Any or function) 값이 true이면 문서가 생성되면 기본값으로 저장됩니다.
  • select : (boolean) 쿼리에 대한 기본 투영을 지정합니다.
  • validate : 함수로 개발자가 조건을 만듭니다.
  • set : 값을 입력할 때 함수로 조건을 만듭니다.
  • get : 값을 출력할 때 함수로 조건을 만듭니다.
  • alias : (string) 지정된 이름으로 이 경로를 가져오거나 설정하는 가상을 정의합니다.
  • immutable : (boolean) 경로를 불변으로 정의합니다. Mongoose는 상위 문서에 "isNew: true"가 없는 한 변경할 수 없는 경로를 방지합니다
  • transform : (function) 몽구스는 JSON.stringify() 문서를 포함하여 "Document# to JSON()" 함수를 호출할 때 이 함수를 호출합니다.
  • index : (boolean) 이 속성에 인덱스를 정의할지 여부를 지정합니다.
  • unique : (boolean) 이 속성에 unique 인덱스를 정의할지 여부를 지정합니다.
  • sparse : (boolean) 이 속성에 sparse 인덱스를 정의할지 여부를 지정합니다.

5. Model

  • 스키마를 사용하여 만드는 인스턴스로, 데이터베이스에서 실제 작업을 처리할 수 있는 함수들을 지니고 있는 객체

  • 모델을 만들 때는 mongoose.model 함수를 사용한다.

  • model() 함수는 두 개의 파라미터를 필요로 한다.

  • 첫 번째 파라미터는 스키마 이름이고, 두 번째 파라미터는 스키마 객체이다.

  • 데이터베이스는 스키마 이름을 정해주면 그 이름의 복수 형태로 데이터베이스에 컬렉션 이름을 만든다.(스키마 이름이 'Post'이면 컬렉션은 'posts'로 생성)

  • MongoDB에서 컬렉션 이름을 만들 때, 권장되는 컨벤션은 구분자를 사용하지 않고 복수 형태로 사용하는 것이다.

  • 컨벤션 규칙을 따르고 싶지 않다면, model()함수의 세 번째 파라미터에 원하는 컬렉션 이름을 넣으면 된다.

const mongoose from 'mongoose';

const { Schema } = mongoose;

// 스키마 객체 생성
const PostSchema = new Schema({
  title: String,
  body: String,
  tags: [String], // 문자열 배열
  publishedDate: {
    type: Date,
    default: Date.now // 현재 날짜를 기본값으로 지정
})

// 모델 생성
const Post = mongoose.model('Post', PostSchema);
const post1 = new Post({
  title : "Post1",
  body : "Body",
  tag : ["tag1","tag2"]
  // 날짜를 입력하지 않으면 현재 날짜가 기본값
})

0개의 댓글