Mongoose 및 Node.js와 관계를 만드는 방법(실제 예제 포함)

무엇보다도 여기에 JOIN이 존재하지 않습니다! 기본적으로 _id를 한 컬렉션에서 다른 컬렉션으로 저장합니다({type: mongoose.Schema.Types.ObjectId,ref:'NameOfSchema'}). 관련된 데이터는 populate() 메서드로 선택합니다.

예제의 아이디어Users 등록을 허용하고 이러한 사용자가 만들 수 있는 시스템Posts이 될 것입니다.

필수 종속성

    "body-parser": "^1.19.0",
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "mongoose": "^5.7.5",
    "nodemon": "^1.19.4"


프로젝트 구조


├── index.js

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const app = express();

// middlewares
app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
mongoose.connect('mongodb://localhost:27017/relationships',{
    useNewUrlParser: true,
    useUnifiedTopology: true 
})

// routes
app.use(require('./app/routes'));

app.listen(3000, () => console.log('server on!'));



├── 모델
└── user.js

const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
    name :{
        type:String,
        required: '{PATH} is required!'
    },
    bio: {
        type:String
    },
    website:{
        type:String
    },
    posts : [
        {type: mongoose.Schema.Types.ObjectId,ref:'Post'}
    ]
},{
    timestamps: true
})

module.exports = mongoose.model('User',UserSchema);



├── 모델
└── post.js

const mongoose  = require('mongoose');
const PostSchema = new mongoose.Schema({
    title:{
        type:String,
        required: '{PATH} is required!'
    },
    subtitle :{
        type: String
    },
    user :{
        type:mongoose.Schema.Types.ObjectId,
        ref:'User'
    }
},{
    timestamps:true
})

module.exports = mongoose.model('Post',PostSchema);


└── user.js ( 컨트롤러 )

const User = require('../../models/user');

module.exports = {
    create : async (req, res) =>{
        const { name, bio, website } = req.body;
        const user = await User.create({
            name,
            bio,
            website
        })

        return res.send(user)
    },

    find : async (req, res) => {
        const user = await User.find()
        return res.send(user)
    },
    postsByUser : async (req, res) => {
       const { id } = req.params;
       const user = await User.findById(id).populate('posts');

        res.send(user.posts);
    }
}


const user = await User.findById(id).populate('posts')는 다음과 같습니다.

 user.posts.forEach(async element => {
           const post = await Post.findById(element);
              console.log(post);
        });


└── post.js ( 컨트롤러 )

const Post = require('../../models/post');
const User = require('../../models/user');

module.exports = {
    create : async (req, res) => {

        console.log(req.params);
        user = req.params;
        id = user.id;
        const { title, subtitle} = req.body;
        const post = await Post.create({
            title,
            subtitle,
            user:id
        });
        await post.save();

        const userById = await User.findById(id);

        userById.posts.push(post);
        await userById.save();

        return res.send(userById);
    },
    userByPost : async (req,res)=>{
        const { id } = req.params;
        const userByPost = await Post.findById(id).populate('user');
        res.send(userByPost);
    }
}


└── route.js

const express = require('express');
const router = new express.Router;
const User = require('./controllers/user/user');
const Post = require('./controllers/post/post');
router.get('/',(req,res)=>res.send('ok'));
// user routes
router.post('/user/create',User.create);
router.post('/user/find',User.find);
router.post('/user/find/post/:id', User.postsByUser);
// post routes
router.post('/post/create/:id', Post.create);
router.post('/post/populate/:id',Post.userByPost);

module.exports = router;


└── package.json 구성
프로젝트에서 nodemon을 사용하려면 "스크립트"에서 "시작"키를 설정하고 nodemon 명령과 응용 프로그램 루트 파일 이름을 전달합니다.

"scripts": {
    "start": "nodemon index.js"
  },


그런 다음 터미널에서 "npm start"명령을 실행하면 프로젝트의 파일이 변경될 때마다 응용 프로그램이 서버를 다시 시작하므로 개발 생산성이 향상됩니다.

최종 결과


thanks for everything! 😄

좋은 웹페이지 즐겨찾기