You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 14:24:06