Mongoose调用updateOne无法向数组push数据问题求助
问题排查与解决
1. UpdateOne参数结构错误
你的updateOne调用参数格式不符合Mongoose要求,该方法的签名是Model.updateOne(filter, update, options)。你把likes更新和$push操作拆成了两个独立参数,导致$push被识别为配置选项而非更新指令,自然不会执行数组推送操作。
正确写法需将所有更新逻辑合并到同一个对象中:
await Review.updateOne( { _id: parsedRequest.id }, { likes: newLikeTotal, $push: { reactedBy: user._id } } );
2. Schema中reactedBy的default配置错误
你在reactedBy数组的内部子对象里设置default: [],这是错误的配置方式。数组类型的默认值应该直接定义在数组级别,而非内部的子文档对象上:
修正后的Schema:
import mongoose from "mongoose"; const ReviewSchema = new mongoose.Schema({ likes: { type: Number, required: true, default: 0, }, reactedBy: [ { required: true, type: mongoose.Types.ObjectId, ref: "User" }, ], createdAt: { type: Date, required: true, default: () => Date.now(), }, updatedAt: Date, }); // 数组默认值直接挂载到Schema字段 ReviewSchema.path('reactedBy').default([]); export default mongoose.models.Review || mongoose.model("Review", ReviewSchema);
更简洁的写法(数组默认即为空数组,可省略显式default,若需明确声明):
reactedBy: { type: [mongoose.Types.ObjectId], ref: "User", default: [] }
额外验证建议
操作后可打印更新结果,通过modifiedCount字段确认是否成功修改文档:
const result = await Review.updateOne(...); console.log(result.modifiedCount); // 输出1表示修改成功,0表示未匹配到文档或无变更
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

