如何在Mongoose中建立User与Project模型关联及创建项目时关联用户
在Mongoose中建立User与Project的关联(类似MySQL关联)
首先得先修正你代码里的一个小错误:const Schema = mongoose.Schema(); 这行写法不对,应该改成 const Schema = mongoose.Schema;(不要加括号)——因为mongoose.Schema是构造函数,不是可直接调用的方法,加括号会生成空Schema,导致后续定义模型出错。
接下来我们实现类似MySQL的一对多关联:一个用户可以拥有多个项目,一个项目仅属于一个用户。Mongoose通过**文档引用(ref)**来实现这种关联,下面分步骤改造你的代码:
1. 修改User Schema
给用户模型添加projects数组字段,用来存储该用户创建的所有项目ID引用:
const mongoose = require('mongoose'); const bcrypt = require('bcrypt-nodejs'); const Schema = mongoose.Schema; // 修正写法 const UserSchema = new Schema({ fullname: { type: String }, username: { type: String }, password: { type: String }, // 新增:关联用户的所有项目 projects: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Project' // 指定引用的模型为Project }] }); // 保留原有的密码加密、验证方法 UserSchema.methods.encryptPassword = function(password) { return bcrypt.hashSync(password, bcrypt.genSaltSync(10), null); }; UserSchema.methods.comparePassword = function(userPassword, cb) { bcrypt.compare(userPassword, this.password, (err, isMatch) => { if(err) throw err; cb(null, isMatch); }); }; module.exports = mongoose.model('User', UserSchema);
2. 修改Project Schema
给项目模型添加createdBy字段,用来存储创建该项目的用户ID引用:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; // 修正写法 const ProjectSchema = new Schema({ title: { type: String, required: true }, description: { type: String }, created_at: { type: Date, default: Date.now }, publish: { type: Boolean, default: false }, // 新增:关联项目的创建者 createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', // 指定引用的模型为User required: true // 强制每个项目必须关联用户 } }); module.exports = mongoose.model('Project', ProjectSchema);
3. 创建Project时关联对应的User
创建项目时需要同时完成两个操作:创建项目文档并关联用户ID,同时将项目ID添加到对应用户的projects数组中。示例代码如下:
const User = require('./User'); const Project = require('./Project'); // 假设你已通过登录等方式获取到目标用户的ID(实际开发中可能从req.user._id获取) const targetUserId = '用户的ObjectId'; // 1. 实例化新Project并关联用户 const newProject = new Project({ title: '我的第一个项目', description: '这是一个测试项目', createdBy: targetUserId // 绑定创建者ID }); // 2. 保存项目后更新用户的项目列表 newProject.save() .then(savedProject => { // 找到目标用户,将新项目ID添加到projects数组 return User.findByIdAndUpdate( targetUserId, { $push: { projects: savedProject._id } }, // 使用$push操作符追加数组元素 { new: true } // 返回更新后的用户文档 ); }) .then(updatedUser => { console.log('项目创建成功,用户已同步更新:', updatedUser); }) .catch(err => { console.error('创建项目失败:', err); });
4. 查询关联数据(可选)
如果需要查询用户的所有项目,或者项目的创建者详情,可以使用Mongoose的populate方法自动替换引用ID为完整文档:
查询用户及其所有项目
User.findById(targetUserId) .populate('projects') // 将projects数组中的ID替换为完整Project文档 .then(user => { console.log('用户及关联项目:', user); }) .catch(err => console.error(err));
查询项目及其创建者
const targetProjectId = '项目的ObjectId'; Project.findById(targetProjectId) .populate('createdBy', 'fullname username') // 仅返回用户的fullname和username字段 .then(project => { console.log('项目及创建者:', project); }) .catch(err => console.error(err));
这样就实现了类似MySQL的一对多关联关系,用户和项目之间可以互相关联查询啦。
内容的提问来源于stack exchange,提问作者user3869304
相关产品推荐
相关产品推荐

