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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:33:40