Mongoose中向用户blogs数组添加新博客ID失败的问题求助
Mongoose中向用户blogs数组添加新博客ID失败的问题求助
嘿,我来帮你梳理下问题根源,你的代码里有几个关键问题导致用户的blogs数组没更新成功:
1. User Schema字段定义存在重复覆盖问题
看你的User Schema里的blogs和comments字段,都重复声明了type属性:
blogs: [ { type: mongoose.SchemaTypes.ObjectId, type: String, // 这里会覆盖上面的ObjectId类型 ref: "Blog", required: false, default: [], }, ],
这会让Mongoose最终把blogs字段的类型解析成String,但新创建的博客_id是ObjectId类型,类型不匹配就没法正确添加到数组里。你需要删掉重复的type: String,修正后的字段定义应该是:
blogs: [ { type: mongoose.SchemaTypes.ObjectId, ref: "Blog", required: false, default: [], }, ], comments: [ { type: mongoose.SchemaTypes.ObjectId, ref: "Comment", required: false, default: [], }, ],
2. 更新用户数组的代码逻辑有误
你当前的更新写法存在两个小问题:
- 你调用了
user.updateOne(),但这个方法是直接操作数据库的Model方法,不是文档实例的方法,而且你传入的匹配条件{ blogs: [...user.blogs] }完全没必要,反而可能因为数组内容变化导致匹配不到; - 你试图
$push: { blogs: newBlog },这是把整个博客对象塞进去,但我们只需要存博客的_id就行。
给你两种修正后的可行方案:
方案一:直接操作用户文档实例
const { title, content, author } = input; const newBlog = await Blog.create({ title, content, author }); // 找到用户后直接push ID并保存 const user = await User.findById(author); user.blogs.push(newBlog._id); await user.save(); console.log(newBlog); return await newBlog.populate("author");
方案二:用原子操作一步完成(更高效)
这种方式不需要先查询用户再保存,直接用findByIdAndUpdate执行原子更新,避免并发场景下的竞态问题:
const { title, content, author } = input; const newBlog = await Blog.create({ title, content, author }); // 直接更新用户的blogs数组 await User.findByIdAndUpdate( author, { $push: { blogs: newBlog._id } }, { new: true } // 可选,设置后返回更新后的用户文档 ); console.log(newBlog); return await newBlog.populate("author");
额外提醒
记得确保你的Blog和User模型已经正确关联(比如用mongoose.model("Blog", blogSchema)和mongoose.model("User", userSchema)),不然ref关联会失效哦。
备注:内容来源于stack exchange,提问作者Shadq
相关产品推荐
相关产品推荐

