Mongoose如何向Signup文档的truckIds子文档数组插入数据
你遇到的问题本质是Schema定义的结构和你预期存储的结构、传参结构不匹配,分两种场景对应解决方案:
方案1:调整Schema匹配你预期的纯ID数组结构
如果你期望最终存储的truckIds是直接存Truck ID的一维数组,直接修改Schema里的truckIds定义即可:
const signupSchema = mongoose.Schema({ userId: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true }, cargoId: { type: mongoose.Schema.Types.ObjectId, ref: "Cargo", required: true }, // 去掉嵌套的truckId对象,直接定义为ObjectId数组 truckIds: [{ type: mongoose.Schema.Types.ObjectId, ref: "Truck", required: true }], approved: { type: Boolean ,required: true }, finished: { type: Boolean ,required: true }, // 补充你代码里用到的cmrCreated字段,否则mongoose会自动忽略该字段不存储 cmrCreated: { type: Boolean, default: false } });
修改后只要前端传的req.body.truckIds是["id1","id2"]格式的ID数组,直接赋值就能存入你预期的结构。
方案2:不修改Schema,调整传参格式匹配现有定义
如果你要保留现有Schema的嵌套对象结构,需要把前端传的ID数组转换成符合Schema要求的格式,修改控制器代码里truckIds的赋值逻辑:
const signup = new Signup({ userId: req.userData.userId, cargoId: req.body.cargoId, // 把纯ID数组映射为带truckId字段的对象数组,匹配Schema定义 truckIds: req.body.truckIds.map(id => ({ truckId: id })), approved: req.body.approved, finished: req.body.finished, cmrCreated: false });
这种场景下存入的truckIds结构会是[{"_id": "xxx", "truckId": "id1"}, {"_id": "xxx", "truckId": "id2"}],符合你最初的Schema定义。
额外注意:你当前代码里用到的cmrCreated字段没有在Schema中定义,默认配置下mongoose不会存储该字段,有需要记得补充到Schema里。
内容的提问来源于stack exchange,提问作者nbalog
相关产品推荐
相关产品推荐

