使用Mongoose创建MongoDB文档时数组被设为undefined问题咨询
Mongoose插入文档时数组字段被设为[undefined]的问题
在ES6环境下使用Mongoose(版本^7.6.3)向MongoDB插入文档,文档成功生成,但invitedGuestPass数组被设置为[undefined],而非传入的对象数组。
创建代码
Passes.create( { passDate: '20147', invitedGuestPass: [{ residentId: new mongoose.Types.ObjectId(), residentFirstName: 'Jack', residentLastName: 'Smith', residentEmail: 'urbgfec@gmail.com', invitedGuestId: new mongoose.Types.ObjectId(), invitedGuestName: request.body.guestName, invitedGuestNumber: request.body.guestNumber, invitedGuestPassScanned: false, invitedGuestPassSent: false }] } ) .then((result) => { console.log(result); }) .catch((error) => { console.log(error); })
原Schema定义
const mongoose = require("mongoose"); const invitedGuestPassesSchema = new mongoose.Schema({ residentId: { type: mongoose.Schema.ObjectId, required: [true, "Please provide and ID..."], unique: false }, residentFirstName: { type: String, required: [true, "Please provide the resident's first name..."], unique: false }, residentLastName: { type: String, required: [true, "Please provide the resident's last name..."], unique: false }, residentEmail: { type: String, required: [true, "Please provide the resident's email..."], unique: false }, invitedGuestId: { type: mongoose.Schema.ObjectId, required: [true, "Please provide and ID..."], unique: false }, invitedGuestName: { type: String, required: [true, "Please provide the guest's name..."], unique: false }, invitedGuestNumber: { type: String, required: [true, "Please provide the guest's phone number..."], unique: false }, invitedGuestPassScanned: { type: Boolean, required: [true, "Please provide if the pass has been scanned..."], unique: false }, invitedGuestPassSent: { type: Boolean, required: [true, "Please provide if the pass has been sent..."], unique: false }, }) const passesSchema = new mongoose.Schema({ passDate: { type: String, required: [true, "Please give date of visit..."], unique: true }, invitedGuestPass: { invitedGuestPass: [invitedGuestPassesSchema], type: Array, required: [true, "Please give list of invited guests..."], unique: false }, }) module.exports = mongoose.model.Passes || mongoose.model("Passes", passesSchema);
已尝试的无效操作
- 将Schema简化为整数数组,传入
[1,2,3]仍得到undefined数组; - 修改
passesSchema中invitedGuestPass的type为[invitedGuestPassesSchema],删除嵌套的invitedGuestPass字段,问题依旧; - 验证传入的数据确实为数组(
Array.isArray返回true); - 尝试使用
insert、insertOne方法,报错“insert is not a function”。
问题原因及解决方案
核心问题
passesSchema中invitedGuestPass字段的定义存在结构错误:错误地嵌套了一层同名字段,且数组类型的声明方式不符合Mongoose规范,导致Mongoose无法正确映射传入的数组数据,最终解析为[undefined]。
修正后的Schema
修改passesSchema中的invitedGuestPass字段定义,直接将类型指定为子Schema数组:
const passesSchema = new mongoose.Schema({ passDate: { type: String, required: [true, "Please give date of visit..."], unique: true }, invitedGuestPass: { type: [invitedGuestPassesSchema], // 直接声明为子Schema数组 required: [true, "Please give list of invited guests..."], unique: false }, })
额外验证点
同时需要确认request.body.guestName和request.body.guestNumber有有效值,若这两个字段为undefined,会触发子Schema的必填校验,可能导致整个对象无法正确存入数组(不过当前问题的核心是Schema结构错误)。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

