如何在MongoDB Mongoose中创建用于上传对象数组的Schema?
问题分析与解决
你尝试的两种Mongoose Schema定义都存在问题,导致无法正常上传对象数组,下面逐一说明并给出正确方案:
1. 两种错误Schema的问题
第一种Schema
const arrayOfObjectsSchema = new Schema({ array: [ { title: { type: String, required: true }, desc: { type: String, required: true }, img: { type: String, required: true }, content: { type: String, required: true }, username: { type: String, required: true }, }, ], });
这种定义是创建一个包含array字段的单个文档,而非直接存储对象数组集合。如果你的需求是集合里每个文档对应数组中的一个对象,这个结构不符合预期。
第二种Schema
const arrayOfObjectsSchema = new Schema([ { title: { type: String, required: true }, desc: { type: String, required: true }, img: { type: String, required: true }, content: { type: String, required: true }, username: { type: String, required: true }, }, ], );
Mongoose的Schema构造函数仅接受单个文档的结构对象,直接传入数组属于错误用法,无法被正确解析。
2. 正确的Schema定义(批量存储单个对象)
如果你的需求是集合中每个文档对应数组里的一个对象,直接定义单个对象的Schema即可:
const itemSchema = new Schema({ title: { type: String, required: true }, desc: { type: String, required: true }, img: { type: String, required: true }, content: { type: String, required: true }, username: { type: String, required: true }, }); const ItemModel = mongoose.model('Item', itemSchema);
之后上传数组时,使用insertMany方法批量插入:
const items = [ { title: 'alo', desc: 'papii', img: 'QRx7MzF8KhM', content: 'cry', username: 'andria' }, { title: 'alo', desc: 'papii', img: 'QRx7MzF8KhM', content: 'cry', username: 'andria' } ]; // 批量插入操作 ItemModel.insertMany(items) .then(result => console.log('上传成功')) .catch(err => console.error('上传失败:', err));
3. 你上传数据的语法错误
你提供的上传数组中,两个对象之间缺少逗号,这会导致JavaScript语法错误,修正后才能正常使用(上述示例已修正该问题)。
补充:单个文档存储对象数组的方案
如果你的需求是把整个对象数组存放在一个文档中,第一种Schema是可行的,但上传时需要把数组嵌套在array字段里:
const arraySchema = new Schema({ array: [ { title: { type: String, required: true }, desc: { type: String, required: true }, img: { type: String, required: true }, content: { type: String, required: true }, username: { type: String, required: true }, }, ], }); const ArrayModel = mongoose.model('Array', arraySchema); // 上传数据 const data = { array: [ { title: 'alo', desc: 'papii', img: 'QRx7MzF8KhM', content: 'cry', username: 'andria' }, { title: 'alo', desc: 'papii', img: 'QRx7MzF8KhM', content: 'cry', username: 'andria' } ] }; ArrayModel.create(data) .then(result => console.log('上传成功')) .catch(err => console.error('上传失败:', err));
内容的提问来源于stack exchange,提问作者Andria Marqarovi
相关产品推荐
相关产品推荐

