如何与 Mongoose 和 Node.js 创建关系(附真实示例)

2025-05-25

如何与 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"
Enter fullscreen mode Exit fullscreen mode

项目结构
替代文本

│ │ 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!'));

Enter fullscreen mode Exit fullscreen mode

│ │ 模型
└── 用户.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);

Enter fullscreen mode Exit fullscreen mode

│ │ 模型
└── 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);
Enter fullscreen mode Exit fullscreen mode

└── 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);
    }
}

Enter fullscreen mode Exit fullscreen mode

请注意,这const user = await User.findById(id).populate('posts')相当于:

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

└── 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);
    }
}
Enter fullscreen mode Exit fullscreen mode

└── routes.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;
Enter fullscreen mode Exit fullscreen mode

配置└──package.json
以在您的项目中使用 nodemon,在“scripts”中设置“start”键,传递 nodemon 命令和应用程序根文件名。

"scripts": {
    "start": "nodemon index.js"
  },
Enter fullscreen mode Exit fullscreen mode

此后,在终端中运行命令“npm start”,每次项目文件发生更改时,应用程序都会重新启动服务器,从而提高开发效率。

最终结果

替代文本

thanks for everything!😄

文章来源:https://dev.to/mkilmer/how-create-relationships-with-mongoose-and-node-js-with-real-example-43ei
PREV
您不知道自己需要的 API
NEXT
JavaScript 框架比较:Vue、React 和 Angular