NodeJS+Express+Mongoose如何将jokesSchema数据推送到userSchema数组
问题根源
- 你定义的
userSchema里savedjokes字段存储的是关联jokes集合的ObjectId,而你当前代码直接往数组中推送笑话内容对象,类型不匹配自然无法正常写入 - 缺少先把笑话存入
jokes集合(或查询已存在的笑话id)的步骤,你需要先拿到对应笑话的ObjectId才能存入用户的savedjokes数组 $push语法使用错误,单条元素推送不需要嵌套数组- 额外提醒:
userSchema里的password字段不要设置lowercase: true,会导致密码丢失大小写信息,存在严重安全隐患
修改后的代码
第一步:引入依赖
首先在User.Controller.js顶部引入所需的两个Model:
import UserModel from './User.Model.js' import JokesModel from './Jokes.Model.js' // 若你没有单独定义StatusCode常量,直接用200、500状态码即可
第二步:重写saveJoke方法
const saveJoke = async (request, response) => { const { userId } = request.params const { joke } = request.body try { // 1. 先查询笑话是否已存在,不存在则创建存入jokes集合 let jokeDoc = await JokesModel.findOne({ joke }) if (!jokeDoc) { jokeDoc = await JokesModel.create({ joke }) } // 2. 把笑话的_id推入用户的savedjokes数组,$addToSet可避免同一用户重复收藏同一笑话 const updatedUser = await UserModel.findByIdAndUpdate( userId, { $addToSet: { savedjokes: jokeDoc._id } }, { new: true, useFindAndModify: false } ) // 可选:填充savedjokes字段直接返回笑话内容,方便前端使用 await updatedUser.populate('savedjokes') response.status(200).send(updatedUser) } catch (error) { response.status(500).send({message: error.message}) } };
补充说明
- 如果你允许用户重复收藏同一个笑话,把
$addToSet换回$push即可 - 后续查询用户收藏列表时,调用
.populate('savedjokes')就能自动把id替换为对应的笑话内容,无需手动关联查询
内容的提问来源于stack exchange,提问作者elmgren
相关产品推荐
相关产品推荐

