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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:08:15