2022이전/node.js

Nodejs, express, MongDB를 이용한 CRUD(2)_모델링

바로퇴장 2020. 1. 12. 19:45

User

  • email : string/trim/unique/required
  • name : string/trim
  • password(암호화 x) string/최소 4글자 이상

Board

  • title : String/require
  • Content : String/require
  • user : objectId/ref:'User'
  • Likes : [objectId/ref:'User']

Comment

  • content: String
  • user : objectId/ref:'User'
  • board: objectId/ref:'Board'
  • Parent_comment:ObjectId/ref:'Comment'
  • re_comments:[objectId/ref:'Comment']

Like

  • User : objectId/ref:'User'
  • Board: objectId/ref:'Board'

Model/User.js

const UserSchema = new Schema({
    email: {
        type: String,
        trim: true,
        unique: true,
        required: true,
    },
    name: {
        trim: true,
        type: String,
    },
    password: {
        type: String,
        validate: [
            function(password){
                return password.length >= 4;
            },
            'Password should be longer than 4 Charters'
        ]
    }
});

Model/board.js

const boardSchema = new Schema({
    //제목
    title: {
        type: String,
        require: true,
    },
    //내용
    content: {
        type: String,
        require: true,
    },
    //유저
    user: {
        type:Schema.Types.ObjectId,
        ref:'User'
    },
    //공개 비공개
    active: {
        type: Number,
        enum: [0, 1],
        default: 0
    },
    //댓글 
    comments: [{
        type:Schema.Types.ObjectId,
        ref:'Comment'
    }],
    //좋아요 유저
    likes: [{
        type:Schema.Types.ObjectId,
        ref:'User'
    }]

});

model/Comment.js

const CommentSchema = new Schema({
    content: String,
    user: {
        type: Schema.Types.ObjectId,
        ref: 'User'
    },
    board: {
        type: Schema.Types.ObjectId,
        ref: 'Board'
    },
    parent_comment: {
        type: Schema.Types.ObjectId,
        ref: "Comment",
        default: null
    },
    re_comments:[{
        type: Schema.Types.ObjectId,
        ref: 'Comment',
        default: null
    }]
});

model/Like.js

const LikeSchema = new Schema({
    user: {
        type: Schema.Types.ObjectId,
        ref: 'User',
    },
    board: {
        type: Schema.Types.ObjectId,
        ref: 'Board'
    }
});

여기서 자주 사용된 것은 ref(외래키)설정해주는 것이다. ref를 이용해서 모델링을 하게 되면 만약 하나의 모델객체를 참조를 해주면 자동으로 해당하는 user._id값이 들어가게 된다.

그리고 type: 외에도 다양한 설정이 가능하다. Unique, enum, date 등 설정이 가능하다.

하지만 ref 외래키를 이용했지만 mongoose에서는 cascade(계단식) 설정은 불가능 하기 때문에 따로 middleware를 통하여 구현을 해야한다. 이 내용은 다음에 알아보자.

대댓글

대댓글 기능을 구현하기 위해서 Comment 모델에서 parent_comment 통해서 대댓글의 부모를 외래키를 뒀으며, re_comment에는 부모 댓글에 달린 댓글들을 이어줄 수 있도록 참조키를 두었다. 이를 통하여 부모 댓글을 통하여 대댓글들을 불러 올 수 있도록 작성하였다. 만약 댓글에 parent_comment 값이 없다면 이 댓글은 parent값이라는 것을 확인 할 수 있을 것이다.

github_page : https://github.com/gmldbd94/node_express_mongoDB