Mongoose插入含数组对象报错:Cast to Array failed问题求助
这个问题我之前碰到过好几次,大概率是两个地方出了问题——要么你的Mongoose模型里parking字段的定义不对,要么你插入的数据里带了Mongoose不认识的额外字段。咱们一步步来排查:
1. 先检查你的Mongoose模型中parking字段的定义
你只给了模型的片段,没说parking怎么定义的,但这是核心问题点。如果要存储数组类型的子文档,你必须明确在模型里指定parking是数组,并且定义好子文档的结构。
举个正确的例子:
// 先定义parking的子Schema const ParkingSubSchema = new mongoose.Schema({ id: Number, numberplate: String, brand: String, model: String, type: Number }); // 然后在主模型里引用这个子Schema作为数组 const YourModel = mongoose.model('YourModel', new mongoose.Schema({ uid: String, firstName: String, lastName: String, to: String, seat_no: String, date_departure: Date, date_return: Date, traveller: String, parking: [ParkingSubSchema] // 这里必须用数组包裹子Schema! }));
如果你的模型里parking没这么定义——比如写成了parking: String或者只写了parking: [](没指定子结构),Mongoose就会把它当成普通数组,遇到子文档里的字段时就会报类型转换错误。
2. 移除插入数据里的$$hashKey字段
你提供的插入对象里,parking数组的每个元素都有$$hashKey: "object:26"——这个是Angular这类前端框架生成的内部标识字段,你的Mongoose模型里根本没定义这个字段,而Mongoose默认是strict: true模式(会拒绝schema里没有的字段),这个额外字段很可能触发了类型转换的报错。
插入前一定要把这个字段删掉,比如用JS的解构来处理:
// 假设你要插入的数据是req.body或者某个变量data const cleanedParking = data.parking.map(item => { // 解构掉$$hashKey,保留其他字段 const { $$hashKey, ...cleanItem } = item; return cleanItem; }); // 然后用清理后的数据插入 YourModel.create({ ...data, parking: cleanedParking });
3. 额外检查:字段类型是否完全匹配
比如你模型里如果把type定义成了String,但插入的是数字1,也可能触发类型转换错误。对照你插入的数据和模型定义,确保每个字段的类型完全一致——比如id是Number,numberplate是String这些,都要对应上。
按这几步排查下来,应该就能解决这个Cast to Array的错误了。
内容的提问来源于stack exchange,提问作者Xsmael
相关产品推荐
相关产品推荐

