Mongoose 5.x未指定Schema时数组被转为对象的问题求助
解决Mongoose 5+版本中未指定Schema时数组被转为对象的问题
我之前也踩过Mongoose 5.x版本的这个坑!当你使用strict: false的空Schema保存包含数组的文档时,Mongoose会把数组自动转成以索引为键的对象,就像你遇到的activity: { "0": {title: "activity1"} }这种情况。这是因为Mongoose 5.x之后调整了无Schema定义时的类型推断逻辑,不再默认识别数组结构。
下面给你几个可行的解决方案:
方案1:明确定义数组字段(推荐)
虽然你用了strict: false,但还是可以针对性地定义需要保持数组类型的字段,这样既保留了动态字段的灵活性,又能确保数组类型正确:
const User = mongoose.model('users', new mongoose.Schema({ // 用Mixed类型允许数组内存储任意结构的对象 activity: [{ type: mongoose.Schema.Types.Mixed }] }, {strict: false})) const user = new User({ name: "some name", activity: [ {title: "activity1"} ] }) await user.save() // 保存后activity会是正常的数组:[ {title: "activity1"} ]
方案2:手动指定数组类型(适合完全动态的场景)
如果你的字段结构完全不确定,不想提前定义Schema,可以在创建文档时用mongoose.Types.Array手动包装数组,强制Mongoose识别它为数组类型:
const User = mongoose.model('users', new mongoose.Schema({}, {strict: false})) const user = new User({ name: "some name", activity: mongoose.Types.Array.from([ {title: "activity1"} ]) }) await user.save()
方案3:修改全局配置(不推荐)
你也可以修改Mongoose的全局配置调整类型推断行为,但这种方法可能影响其他模型的运行逻辑,所以不建议随便使用:
mongoose.set('strictQuery', false) // 或者在创建Schema时添加typeKey配置,不过效果有限 const User = mongoose.model('users', new mongoose.Schema({}, { strict: false, typeKey: '$type' }))
总结一下,最稳妥的还是方案1,明确定义需要的数组字段,既能保证类型正确,又不影响其他动态字段的使用。
内容的提问来源于stack exchange,提问作者Srujan Reddy
相关产品推荐
相关产品推荐

