如何与 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!'));
│ │ 模型
└── 用户.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);
}
}
└── 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;
配置└──package.json
以在您的项目中使用 nodemon,在“scripts”中设置“start”键,传递 nodemon 命令和应用程序根文件名。
"scripts": {
"start": "nodemon index.js"
},
此后,在终端中运行命令“npm start”,每次项目文件发生更改时,应用程序都会重新启动服务器,从而提高开发效率。
最终结果

thanks for everything!
😄