Mongoose findByIdAndUpdate无法递增文档likes值的问题求助
问题原因分析
你的代码执行后数据库点赞数无变化,核心原因是Job Schema里未定义likes字段。
Mongoose默认开启严格Schema校验,所有不在Schema中声明的字段会被自动过滤,不会写入数据库。因此你执行的$inc: {likes:1}更新操作会被Mongoose忽略,自然不会产生任何变更。
解决方案
1. 在Job Schema中添加likes字段
修改Schema定义,补充likes字段并设置合理的类型与默认值:
const mongoose = require('mongoose'); let JobSchema = mongoose.Schema({ student_name: { type: String, required: true }, subject: { type: String, required: true }, grade: { type: Number, required: true }, area: { type: String, required: true }, desc: { type: String, required: true }, accepted: { type: Boolean, required: true, default: false }, tutor_name: { type: String, required: false }, // 新增likes字段 likes: { type: Number, default: 0 // 默认点赞数为0 } } , {collection: 'jobs'}); let Job = mongoose.model('Job' , JobSchema); module.exports = Job;
2. 完善更新逻辑(可选)
修改Schema后原有更新代码即可正常运行,若需增加错误处理可补充如下:
Jobs.findByIdAndUpdate(req.params._id, { $inc: {likes: 1}}, {new: true}) .then((ret) => { console.log('更新后的职位文档:', ret); res.send(ret); }) .catch(err => { console.error('点赞更新失败:', err); res.status(500).send('点赞更新失败'); });
额外说明
如果之前手动在数据库中添加过likes字段,由于Schema未定义,Mongoose查询返回的文档中也不会包含该字段,导致你看到的返回结果里likes始终为0(或无此字段)。只有在Schema中声明后,Mongoose才会处理该字段的读写操作。
内容的提问来源于stack exchange,提问作者ExcaliburZA
相关产品推荐
相关产品推荐

